线程同步:java
因此Java提供了更高级的java.util.concurrent包:安全
java.util.locks.ReentrantLock用于替代synchronized加锁 synchronized是Java语言层面提供的,不需考虑异常 ReentrantLock是普通的Java类,要用try...finally来保证锁可以正确释放 <img src="https://img2018.cnblogs.com/blog/1418970/201906/1418970-20190612191718983-438603878.png" width="500" /> 当咱们使用ReenTrantLock的时候,咱们首先要经过new ReentrantLock()新建一个Lock对象。而后咱们先试图用lock()方法得到当前对象的锁。若是咱们得到锁成功,就进入try代码,最后在finally中用unlock()来释放这个锁。 <font color="red">注意:lock()方法必须在try代码以外完成。由于lock()可能会失败,而unlock()必定要在finally中完成。</font>多线程
class Count{ final Lock lock = new ReetrantLock(); //得到ReentrantLock对象 public void inc(){ lock.lock(); //得到当前对象的锁可能会失败,因此要放在try...finally外面 try{ n = n + 1; }finally{ lock.unlock(); //释放锁 } }
ReentrantLock:this
class Counter{ final Lock lock = new ReentrantLock(); private void inc() throws InterruptedException{ if(lock.tryLock(1, TimeUnit.SECONDS)){ try{ n = n + 1; }finally { lock.unlock(); } } } }
<font color="blue">使用ReentrantLock比直接使用synchronized更安全,由于synchronized会致使线程要么得到锁,要的永远等待下去。而使用ReentrantLock的时候,咱们经过tryLock()在失败的时候不会致使死锁。</font>spa
import java.util.concurrent.locks.ReentrantLock; import java.util.concurrent.locks.Lock; class Counter{ private Lock lock = new ReentrantLock(); private int value = 0; public void add(int m){ lock.lock(); try{ value += m; }finally { lock.unlock(); } } public void dec(int m){ lock.lock(); try{ value -= m; }finally { lock.unlock(); } } public int get(){ lock.lock(); try{ return this.value; }finally { lock.unlock(); } } } public class Main{ final static int LOOP = 100; public static void main(String[] args) throws Exception{ Counter counter = new Counter(); Thread t1 = new Thread(){ public void run(){ for(int i=0;i<LOOP;i++){ counter.add(1); } } }; Thread t2 = new Thread(){ public void run(){ for(int i=0;i<LOOP;i++){ counter.dec(1); } } }; t1.start(); t2.start(); t1.join(); t2.join(); System.out.println(counter.get()); } }