Java并发-synchronized关键字

发布时间:2026/7/28 16:40:39
Java并发-synchronized关键字 概念是利用锁的机制来实现同步的。锁机制有如下两种特性互斥性即在同一时间只允许一个线程持有某个对象锁通过这种特性来实现多线程中的协调机制这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。互斥性我们也往往称为操作的原子性。可见性必须确保在锁被释放之前对共享变量所做的修改对于随后获得该锁的另一个线程是可见的即在获得锁时应获得最新共享变量的值否则另一个线程可能是在本地缓存的某个副本上继续操作从而引起不一致。用法根据修饰对象分类1.1同步方法Public synchronized void methodName(){ …… }1.2同步代码块synchronized(this|object) {} synchronized(类.class) {}根据获取的锁分类获取对象锁synchronized(this|object) {}修饰非静态方法在 Java 中每个对象都会有一个 monitor 对象这个对象其实就是 Java 对象的锁通常会被称为“内置锁”或“对象锁”。类的对象可以有多个所以每个对象有其独立的对象锁互不干扰。获取类锁synchronized(类.class) {}修饰静态方法在 Java 中针对每个类也有一个锁可以称为“类锁”类锁实际上是通过对象锁实现的即类的 Class 对象锁。每个类只有一个 Class 对象所以每个类只有一个类锁。在 Java 中每个对象都会有一个 monitor 对象监视器。某一线程占有这个对象的时候先monitor 的计数器是不是0如果是0还没有线程占有这个时候线程占有这个对象并且对这个对象的monitor1如果不为0表示这个线程已经被其他线程占有这个线程等待。当线程释放占有权的时候monitor-1同一线程可以对同一对象进行多次加锁11重入性synchronized原理分析1.锁方法方法的加锁ACC_SYNCHRONIZED2.锁代码块代码块的加锁monitorenter和monitorExit配合使用Java虚拟机对synchronized的优化JDK1.6以前重量锁偏向锁偏向锁在对象第一次被某一线程占有的时候是否偏向锁置1锁表01写入线程号当其他的线程访问的时候竞争失败 轻量级锁很多次被第一次占有它的线程获取次数多成功CAS算法 campany and setCAS无锁状态时间非常接近竞争不激烈的时候适用轻量级锁线程有交替适用互斥性不是很强CAS失败00重量级锁等待时间长