java volatile synchronized lock

volatile关键字解析

参考链接:http://www.cnblogs.com/mengheng/p/3495379.html

这个关键字去网上查资料,都只是说不能保证原子性,又说有可见性,说的还是模模糊糊,例子都特么一模一样,让人读了还是不知道为啥,其实究其原因就是只叙述了一半,为啥不是线程安全的要点没有讲解的,我有幸翻到一篇博客写的很详细,非常不错,贴链接参考。我先膜拜下,写博客就的究其因,述其果。盗大佬的一张图再说。

java volatile synchronized lock

有大佬的博客,我就直接按照我自己的理解来叙述一遍:

volatile保证可见性,即变量更新后,立即刷新至主内存,其余线程可以读取到最新的变量(网上都只说这么点东西).但是,如果此时A、B两线程都去读取并修改此变量,可能会出现一种现象,即A、B线程同时读取变量,假设此时变量T值是0,A、B两线程都读取到变量T为0,然后进行计算,A线程计算+1操作结果为1 写入变量,并刷新至主内存,线程B已经读取到变量,读取时线程A并没有及时修改,所以线程B也会拿0计算+1,并写入主内存,结果就是变量T为1。所以不能保证线程同步问题,线程同步即线程串行处理就不会出现此问题。

适用场景:我觉得貌似只有网上大部分的例子那种场景会用到,一个线程依赖另一个线程的修改结果。实际场景老实加锁处理,大佬们都说了,现在的锁性能已经非常不错了,而需要用到volatile关键字的地方,不是超级频繁,也不会有问题。不过了解下原因就行。

 

synchronized有lock的区别特点总结:

synchronized是在jvm层实现的锁机制,代码在执行异常时,会自动释放线程占用的锁,不会出现死锁。而Lock发生异常没有进行unLock进行释放很可能会产生死锁。

lock在等待锁时候,可以中断去执行其他代码,但是synchronized会一直等待,直到拿到锁为止。

lock可以知道是否拿到锁,synchronized无法判断是否拿到锁。

lock可以提高多线程读操作,因为读操作无需锁,

lock性能相对较高(看其他人说的),但是一定需要手工释放锁。

 

 

 

 

 

 

转载于:https://my.oschina.net/uwith/blog/3004637