Java 锁
Posted 哈特谢普苏特
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 锁相关的知识,希望对你有一定的参考价值。
1.volatile
volatile具有可见性和一致性,禁止指令重排序优化,但是无法保证原子性,因为很多操作都不是原子操作(如i++)
由Java内存模型来直接保证的原子性变量操作包括read、load、assign、use、store和write这六个
除了volatile之外,Java还有两个关键字能实现可见性,它们是synchronized和final。而final关键字的可见性是指:被final修饰的字段在构造器中一旦被初始化完 成,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通 过这个引用访问到“初始化了一半”的对象),那么在其他线程中就能看见final字段的值。
由于光使用volatile和sychronized无法保证线程的绝对安全,因此引入了锁机制
2.ReentrantLock
ReentrantLock与synchronized相比增加了一些高级功能,主要有以下三项:等待可中断、可实现公 平锁及锁可以绑定多个条件。
Lock应该确保在finally块中释放锁,否则一旦受同步保护的代码块中抛出异常,则有可能永远不 会释放持有的锁。这一点必须由程序员自己来保证,而使用synchronized的话则可以由Java虚拟机来确 保即使出现异常,锁也能被自动释放。
以上是关于Java 锁的主要内容,如果未能解决你的问题,请参考以下文章
Java锁机制(Synchronized)[无锁偏向锁轻量级锁重量级锁]