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 上检索显卡信息?

Android Java保存到文件返回IOException

如何更有效地做到这一点?

关于Java并发编程的总结和思考

并发编程:我对Java并发编程的总结和思考

定义数组,然后改变它的大小