同步方法ReentrantLock和Synchronized
同步格言:
如果你向一个变量写值,而这个变量接下来可能会被另一个线程所读取,或者你从一个变量读值,而它的值可能是前面由另一个线程写入的,此时你就必须使用同步
从JDK5.0开始,有两种机制来保护代码块不受并行访问的干扰。旧版本的Java使用synchronized关键字来达到这个目的,而JDK5.0引进了ReentrantLock类。
1、ReentrantLock显示锁基本用法:public class Bank {private Object lock = new Object();public void transfer(int from,int to,int amount){synchronized(lock){//do something}}}补充:(1)必须知道每个对象都有一个隐式的锁,并且每一个锁都有一个隐式的条件
(2)隐式的锁和条件存在一些缺点,包括:
你不能中断一个正在试图获得锁的线程
试图获得锁时你不能设定超时
每个锁只有一个条件,有时候显得不够用
虚拟机的加锁原语不能很好的映射到硬件可用的最有效的加锁机制上
代码中应该使用Lock和Condition对象还是synchronized方法?下面是建议
一、最好既不要使用Lock/Condition也不使用synchronized关键字。在很多情况下,可以使用java.util.concurrent包中的一种机制,它会为你处理所有的加锁。
二、如果synchronized关键字在你的程序中可以工作,那么请尽量使用它,这样可以减少你的代码数量,减少出错的几率
三、只用在非常需要Lock/Condition结构的独有特性的使用才使用它们