Java-JUC(十五):单例使用“静态方法中的synchronized代码块”执行流程分析

synchronized是一个同步锁,具有可重入、原子性、有序

对象,对象监视器,同步队列和线程状态的关系:

图中描述内容解释:

在Synchronized使用中,任意线程对Object的访问,首先要获得Object的监视器;
如果获取失败,该线程就进入同步状态,线程状态变为BLOCKED;
当Object的监视器占有者释放后,在同步队列中得线程就会有机会重新获取该监视器。

锁获取和锁释放的内存语义

线程A.B同时开始执行,获取主存中的x变量,x的变量初始值是0,线程A优先拿到锁,此时线程A在“同步代码块”或者“同步方法”内修改了x变量的值为1,当线程A释放锁之前会将修改x变量值刷新到主存中。
整个过程即为线程A 加锁-->执行临界区代码-->释放锁相对应的内存语义。

线程B获取锁的时候同样会从主内存中共享变量x的值,这个时候就是最新的值1,然后将该值拷贝到线程B的工作内存中去,释放锁的时候同样会重写到主内存中。

从整体上来看,线程A的执行结果(a=1)对线程B是可见的,实现原理为:释放锁的时候会将值刷新到主内存中,其他线程获取锁时会强制从主内存中获取最新的值。

从横向来看,这就像线程A通过主内存中的共享变量和线程B进行通信,A 告诉 B 我们俩的共享数据现在为1啦,这种线程间的通信机制正好吻合java的内存模型正好是共享内存的并发模型结构。

猜你喜欢

转载自www.cnblogs.com/yy3b2007com/p/11425542.html
今日推荐