摘要:的万能原子,可见,有序原子性如果一个变量事先未被锁定,那么不允许对其操作,也不能一个被其他线程锁定的变量。隐式使用和,保证了和操作之间的代码是原子的。
synchronized的万能(原子,可见,有序) 原子性
如果一个变量事先未被Lock锁定,那么不允许对其unlock操作,也不能unlock一个被其他线程锁定的变量。
synchronized隐式使用lock和unlock,保证了lock和unlock操作之间的代码是原子的。
可见性 1.synchronized的内存语义八大happens-before规则中的两条:
对一个变量执行lock操作,必须清空工作内存中此变量的值,在执行引擎使用该变量之前,重新执行load或assign。
对一个变量unlock操作之前,必须把此变量同步会主内存。
也就是说,
当一个线程获取一个锁,这个线程重新从主内存加载最新的数据到本地内存;
当一个线程释放一个锁的时候,将该线程本地内存中的最新最正确的数据同步到主内存。
两者结合,可以看出锁的释放,获取的内存语义可以类比volatile变量的读/写的内存语义,锁的释放相当于volatile的写,锁的获取相当于volatile的写。所以锁具备内存可见性。
2.如何实现这样的内存语义在JVM规范中可以看到JVM中synchronized的实现原理,JVM基于进入和退出Monitor来实现方法同步和代码同步,实现细节不一样,代码同步使用monitorenter,monitorexit两个指令实现,编译器会在同步代码开始处插入monitorenter指令,在结束处或者异常处插入monitorexit指令,==这两个字节码指令隐式使用lock和unlock操作==。
有序性同一时间只有一个线程可以对一个变量进行lock操作,像是把多线程的环境变为了单线程,天然具备有序性(程序顺序规则)
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/71119.html
摘要:当前线程使用将对象头的替换为锁记录指针,如果成功,当前线程获得锁如果失败,表示其他线程竞争锁,当前线程便尝试使用自旋来获取锁。重量级锁是悲观锁的一种,自旋锁轻量级锁与偏向锁属于乐观锁。 操作系统在面对线程间同步的时候,会支持例如semaphore信号量和mutex互斥量等同步原语,而monitor是在编程语言中被实现的,下面介绍一下java中monitor(监视器/管程:管理共享变量以...
摘要:加锁,多线程为了防止竞争资源,即防止对同一资源进行并发操作。释放占有的对象锁,线程进入等待池,释放而其他正在等待的线程即可抢占此锁,获得锁的线程即可运行程序。休眠结束,线程重新获得执行代码。则是唤醒所有等待的线程。 先了解一下java 模型 showImg(https://segmentfault.com/img/bVbid2W?w=423&h=377); (1)每个线程都有自己的本地...
摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...
摘要:语言在之前,提供的唯一的并发原语就是管程,而且之后提供的并发包,也是以管程技术为基础的。但是管程更容易使用,所以选择了管程。线程进入条件变量的等待队列后,是允许其他线程进入管程的。并发编程里两大核心问题互斥和同步,都可以由管程来帮你解决。 并发编程这个技术领域已经发展了半个世纪了。有没有一种核心技术可以很方便地解决我们的并发问题呢?这个问题, 我会选择 Monitor(管程)技术。Ja...
阅读 2716·2023-04-25 14:21
阅读 1150·2021-11-23 09:51
阅读 3914·2021-09-22 15:43
阅读 596·2019-08-30 15:55
阅读 1535·2019-08-29 11:28
阅读 2392·2019-08-26 11:44
阅读 1658·2019-08-23 18:15
阅读 2847·2019-08-23 16:42