码云pages做静态网站国外一个做同人动漫的网站
- 作者: 五速梦信息网
- 时间: 2026年04月20日 10:28
当前位置: 首页 > news >正文
码云pages做静态网站,国外一个做同人动漫的网站,大宗交易平台有哪些,网站建设与管理软件本文对Java的内存管理模型、volatile关键字和锁机制进行详细阐述#xff0c;包括synchronized关键字、Lock接口及其实现类ReentrantLock、AQS等的实现原理和常见方法。 一、JMM#xff08;Java内存模型#xff09;
- 介绍 JMM定义了共享内存中多线程程序读写操作的行为规…本文对Java的内存管理模型、volatile关键字和锁机制进行详细阐述包括synchronized关键字、Lock接口及其实现类ReentrantLock、AQS等的实现原理和常见方法。 一、JMMJava内存模型
- 介绍 JMM定义了共享内存中多线程程序读写操作的行为规范通过这些规则来规范对内存的读写操作从而保证指令的正确性。 2. 模型
JMM把内存分为两块一块是私有线程的工作区域工作内存一块是所有线程的共享区域主内存线程跟线程之间是相互隔离线程跟线程交互需要通过主内存 二、Volatile关键字 - 介绍 Volatile关键字主要用于修饰成员变量实例变量或类变量使得对该变量的读写操作直接与主内存交互而不是通过线程本地的工作内存进行缓存。Volatile关键字提供了一种轻量级的同步机制用于保证多线程环境下数据的可见性但不能保证数据的原子性Synchronized关键字既保证可见性又保证原子性
- Volatile禁止指令重排 1指令重排 指令重排是一种编译器和处理器优化技术它改变指令执行的顺序以提高性能。在单线程环境下这种优化不会影响程序的正确性。但是在多线程环境下指令重排可能导致意想不到的结果破坏程序的正确性。 2Volatile如何禁止指令重排 通过在读写 volatile 变量时插入内存屏障Memory Barriers来实现 写屏障Write Barrier确保在写 volatile 变量之前的所有写操作在内存中完成。读屏障Read Barrier确保在读 volatile 变量之后的所有读操作在内存中完成 volatile关键字一般加在写变量最后一个读变量第一个。 class Example {private volatile boolean flag false;private int a 0;public void writer() {a 1; // 1flag true; // 2}public void reader() {if (flag) { // 3int i a; // 4}} }上述示例中 在writer方法中写入a 11操作不能被重排序到写入flag true2之后。因为flag是volatile在写flag的时候会插入一个StoreStore屏障确保在flag被写入之前所有之前的写操作都完成了。在reader方法中读取flag3操作不能被重排序到读取a4之前。因为flag是volatile在读flag的时候会插入一个LoadLoad屏障确保在flag被读取之后所有之前的读操作都完成了。 三、锁
- 悲观锁和乐观锁 1悲观锁认为访问共享资源时一定会发生线程安全问题因此在访问时必须加锁。 2乐观锁认为访问共享资源时不一定会发生线程安全问题因此不会加锁当提交修改的时候去验证对应的资源也就是数据是否被其它线程修改即可。 3二者区别 特性悲观锁乐观锁锁定机制操作数据前先加锁其他线程无法操作操作数据时不加锁提交时检查冲突使用场景适用于写多读少冲突概率高的场景适用于读多写少冲突概率低的场景性能由于频繁加锁和释放锁性能较低不加锁性能较高实现方式使用数据库锁机制如行锁、表锁使用版本号或时间戳进行冲突检测数据一致性一致性强通过锁机制防止并发修改一致性依赖于冲突检测和重试机制并发性并发性差锁定会阻塞其他线程并发性好线程可以同时进行操作死锁风险存在死锁风险不存在死锁风险典型应用行锁、表锁、页锁和意向锁数据库、ReentrantLock等版本控制系统、CASCompare and Swap操作
- synchronized 关键字 1介绍 synchronized 关键字是一种对象锁采用互斥的方式让同一时刻至多只有一个线程能持有对象锁。 2底层实现原理 ① Monitor对象监视器 Monitor监视器是一种同步机制用于管理多线程之间的互斥访问和并发控制。Monitor是JVM提供的但是是基于c实现的。Monitor的结构 Owner:存储当前获取锁的线程的只能有一个线程可以获取EntryList:关联没有抢到锁的线程处于Blocked状态的线程WaitSet:关联调用了wait方法的线程处于Waiting状态的线程 ② synchronized关键字实现原理 线程获得锁需要使用对象锁关联monitor监视器即获得monitor的持有权。 3使用方法 同步方法当一个线程执行同步方法时它会自动获得该方法所属对象的锁。其他线程在获得该锁之前无法执行该方法。 public class SynchronizedExample {private int count 0;public synchronized void increment() {count;}public synchronized int getCount() {return count;} }同步块同步块用于在一个方法内同步部分代码提供了比同步方法更细粒度的控制。 public class SynchronizedBlockExample {private final Object lock new Object();private int count 0;public void increment() {synchronized (lock) {count;}}public int getCount() {synchronized (lock) {return count;}} }静态同步方法静态同步方法锁定的是类对象对于所有该类的实例都有效。 public class StaticSynchronizedExample {private static int count 0;public static synchronized void increment() {count;}public static synchronized int getCount() {return count;} }3. synchronized锁升级 Monitor实现的锁属于重量级锁因为monitor是使用c实现的里面涉及到了用户态和内核态的切换、进程的上下文切换成本较高性能比较低。在JDK 1.6引入了两种新型锁机制偏向锁和轻量级锁。 1对象的内存结构 注填充为8的整数倍是方便字节对齐提高程序运行效率 而且对于压缩指针也更加的方便。 2轻量级锁 在无竞争的情况下轻量级锁使用CAS操作来实现锁的获取和释放提高运行效率。 ① 加锁流程 在线程栈中创建一个Lock Record将其obj字段指向锁对象。通过CAS指令将Lock Record的地址存储在对象头的mark word中如果对象处于无锁状态则修改成功代表该线程获得了轻量级锁。如果是当前线程已经持有该锁了代表这是一次锁重入。设置Lock Record第一部分为null起到了一个重入计数器的作用。仍需CAS操作如果CAS修改失败说明发生了竞争需要膨胀为重量级锁。 ② 解锁过程 遍历线程栈,找到所有obj字段等于当前锁对象的Lock Record。如果Lock Record的Mark Word为null代表这是一次重入将obj设置为null后continue。如果Lock Record的 Mark Word不为null则利用CAS指令将对象头的mark word恢复成为无锁状态。如果失败则膨胀为重量级锁。 3偏向锁 与轻量级锁不同的是偏向锁只第一次获得锁时使用 CAS 将线程 ID 设置到对象的 Mark Word 头之后该线程再获取锁时只需要判断锁对象mark word中是否是自己的线程id即可。 注轻量级锁和偏向锁都是在没有竞争的情况下使用一旦发生了竞争会立刻升级为重量级锁。
- Lock接口ReentrantLock Lock接口提供了一种比传统的同步块和方法更灵活的锁机制。Lock 接口有多种实现其中最常用的是 ReentrantLock。 1Lock接口常见实现类 实现类描述ReentrantLock可重入的互斥锁具有与使用 synchronized 方法和语句相同的基本行为和语义但功能更强大。ReentrantReadWriteLock.ReadLock读锁可被多个读线程同时持有只要没有写线程持有写锁。ReentrantReadWriteLock.WriteLock写锁独占锁只有写线程可以持有读线程和其他写线程都被阻塞。StampedLock一种新的读写锁实现支持乐观读锁和写锁的互斥锁操作提高并发性和性能。LockSupport提供了基本的线程阻塞原语用于创建锁和其他同步工具。 2ReentrantLock ① ReentrantLock是一个可重入且独占式的锁还支持轮询、超时、中断、公平锁和非公平锁等。 ② 特点 可重入性一个线程可以多次获得该锁而不会导致死锁。这意味着同一个线程可以进入锁保护的代码块多次必须确保在离开代码块时相应的次数解锁。公平性可以选择公平锁或者非公平锁。公平锁按照线程请求的顺序获取锁非公平锁则没有这种顺序可能导致某些线程长时间等待。灵活性提供了比 synchronized 块更灵活的锁获取方式如可中断的锁获取、超时的锁获取。 ③ 实现原理 ReentrantLock使用CASAQS来实现使用用一个整数state表示锁的状态使用一个先进先出的队列CLH管理被阻塞的线程。当线程需要获得锁时使用CAS操作修改锁的状态修改成功则获得锁修改失败则加入CLH队列管理。 ④ 常用方法 方法描述lock()获取锁。如果锁不可用则当前线程将被禁用以进行线程调度并处于休眠状态直到获得锁。unlock()释放锁。tryLock()尝试获取锁。如果锁在调用时未被另一个线程持有则获取锁并立即返回 true否则返回 false。tryLock(long time, TimeUnit unit)尝试在给定的等待时间内获取锁。如果锁在给定时间内可用则获取锁并返回 true否则返回 false。lockInterruptibly()如果当前线程未被中断则获取锁。如果锁不可用则当前线程出于线程调度目的将被禁用并处于休眠状态直到发生以下两种情况之一锁由当前线程获得或者其他某个线程中断当前线程。newCondition()返回一个绑定到此 Lock 实例的新 Condition 实例。
- synchronized与ReentrantLock的比较 特性synchronizedReentrantLock锁类型隐式锁显式锁获取锁的方式自动需要显式调用 lock() 方法释放锁的方式自动需要显式调用 unlock() 方法可重入性是是公平锁支持否是通过构造函数可以指定条件变量支持否是通过 newCondition() 方法获取锁中断否是通过 lockInterruptibly() 方法超时锁获取否是通过 tryLock(long time, TimeUnit unit) 方法性能开销较低JVM 内部优化较高锁的范围代码块或方法灵活可锁代码块代码复杂度低较高推荐使用场景简单的同步需求复杂的同步需求如需要公平锁、超时等
- AQSAbstract Queued Synchronizer抽象队列同步器 1介绍 AQS是Java 并发包 (java.util.concurrent.locks) 中的一个核心框架是构建各种锁和同步组件的基础框架。 2实现原理 AQS 使用一个 int 类型的变量 state 表示同步状态。AQS 内部维护了一个 FIFO 队列用于管理获取锁失败的线程。线程在争夺锁失败后会被封装成队列节点Node并加入到等待队列中。队列中每个节点包含线程引用和状态标志 3常用方法 方法描述acquire(int arg)独占模式获取锁如果获取失败则进入等待队列。release(int arg)独占模式释放锁如果释放成功则唤醒等待队列中的下一个节点。acquireShared(int arg)共享模式获取锁如果获取失败则进入等待队列。releaseShared(int arg)共享模式释放锁如果释放成功则唤醒等待队列中的下一个节点。addWaiter(Node mode)将当前线程封装成节点并加入等待队列的尾部。unparkSuccessor(Node node)唤醒等待队列中的下一个节点。 4常见实现类 实现类描述ReentrantLock可重入独占锁。允许线程重复获取同一把锁。ReentrantReadWriteLock可重入读写锁。支持多个线程同时读取数据但写操作是互斥的。Semaphore信号量。控制同时访问特定资源的线程数。CountDownLatch倒计时闩。一个或多个线程等待其他线程完成操作后再继续执行。CyclicBarrier循环栅栏。一组线程相互等待达到同步点后再继续执行。Phaser阶段器。管理多个参与者线程的同步支持动态注册和注销。StampedLock读写锁的改进版本支持乐观读取和写锁。Condition条件变量。与锁配合使用允许线程等待某个条件变为真。
- 上一篇: 马尾网站建设网络营销外包哪家好
- 下一篇: 买表的网站给小孩子做网站
相关文章
-
马尾网站建设网络营销外包哪家好
马尾网站建设网络营销外包哪家好
- 技术栈
- 2026年04月20日
-
马家堡做网站的公司商业网站服务
马家堡做网站的公司商业网站服务
- 技术栈
- 2026年04月20日
-
马洪旭 做的网站大学网站做广告费用
马洪旭 做的网站大学网站做广告费用
- 技术栈
- 2026年04月20日
-
买表的网站给小孩子做网站
买表的网站给小孩子做网站
- 技术栈
- 2026年04月20日
-
买房子最好的网站百度关键词代做排名
买房子最好的网站百度关键词代做排名
- 技术栈
- 2026年04月20日
-
买服务器网站phpcms v9网站性能优化
买服务器网站phpcms v9网站性能优化
- 技术栈
- 2026年04月20日
