行业知识
【Synchronized同步原理】
2026-11-03 18:33:26
来源:互联网转载
Synchronized同步原理
- 1. synchronized的使用?
- 2. 如何保证线程安全的?
- 3.可重入原理(加锁次数计数器)
- 4. 原���性和可见性(顺序性)
1. synchronized的使用?
- 对象锁
- 方法锁
- 类锁
2. 如何保证线程安全的?
public class SynchronizedDemo2 { Object object = new Object(); public void method1() { synchronized (object) { } }}执行javac SynchronizedDemo2.java, javap -verbose SynchronizedDemo2.class
下图表现了对象,对象监视器,同步队列以及执行线程状态之间的关系:
该图可以看出,任意线程对Object的访问,首先要获得Object的监视器,如果获取失败,该线程就进入同步状态,线程状态变为BLOCKED,当Object的监视器占有者释放后,在同步队列中得线程就会有机会重新获取该监视器。
3.可重入原理(加锁次数计数器)
public class SynchronizedDemo { public static void main(String[] args) { synchronized (SynchronizedDemo.class) { } method2(); } private synchronized static void method2() { }}public static void main(java.lang.String[]); descriptor: ([Ljava/lang/String;)V flags: (0x0009) ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=3, args_size=1 0: ldc #2 // class tech/pdai/test/synchronized/SynchronizedDemo 2: dup 3: astore_1 4: monitorenter 5: aload_1 6: monitorexit 7: goto 15 10: astore_2 11: aload_1 12: monitorexit 13: aload_2 15: invokestatic #3 // Method method2:()V Exception table: from to target type 5 7 10 any 10 13 10 any
Synchronized先天具有重入性。每个对象拥有一个计数器,当线程获取该对象锁后,计数器就会加一,释放锁后就会将计数器减一。
4. 原子性和可见性(顺序性)
- 保证可见性的原理:内存模型和happens-before规则
- Synchronized的happens-before规则,即监视器锁规则:对同一个监视器的解锁,happens-before于对该监视器的加锁。继续来看代码:
public class MonitorDemo { private int a = 0; public synchronized void writer() { // 1 a++; // 2 } // 3 public synchronized void reader() { // 4 int i = a; // 5 } // 6}该代码的happens-before关系如图所示:
在图中每一个箭头连接的两个节点就代表之间的happens-before关系,黑色的是通过程序顺序规则推导出来,红色的为监视器锁规则推导而出:
线程A释放锁happens-before线程B加锁,蓝色的则是通过程序顺序规则和监视器锁规则推>测出来happens-befor关系,通过传递性规则进一步推导的happens-before关系。现在我们来重点关注2 happens-before 5,通过这个关系我们可以得出什么?根据happens-before的定义中的一条:如果A happens-before B,则A的执行结果对B可见,并且A的执行顺序先于B。线程A先对共享变量A进行加一,由2 happens-before 5关系可知线程A的执行结果对线程B可见即线程B所读取到的a的值为1。
下一篇:sixtieth怎么分音节?