这篇文章主要讲解了“Java多线程的内置锁与显示锁介绍”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java多线程的内置锁与显示锁介绍”吧!
Synchronized
内置锁获得锁和释放锁是隐式的,进入synchronized修饰的代码就获得锁,走出相应的代码就释放锁。
synchronized(list){ //获得锁 list.append(); list.count(); }//释放锁
通信
与Synchronized配套使用的通信方法通常有wait(),notify()。
wait()方法会立即释放当前锁,并进入等待状态,等待到相应的notify并重新获得锁过后才能继续执行;notify()不会立刻立刻释放锁,必须要等notify()所在线程执行完synchronized块中的所有代码才会释放。用如下代码来进行验证:
public static void main(String[] args){ List list = new LinkedList(); Thread r = new Thread(new ReadList(list)); Thread w = new Thread(new WriteList(list)); r.start(); w.start(); }class ReadList implements Runnable{ private List list; public ReadList(List list){ this.list = list; } @Override public void run(){ System.out.println("ReadList begin at "+System.currentTimeMillis()); synchronized (list){ try { Thread.sleep(1000); System.out.println("list.wait() begin at "+System.currentTimeMillis()); list.wait(); System.out.println("list.wait() end at "+System.currentTimeMillis()); } catch (InterruptedException e) { e.printStackTrace(); } } System.out.println("ReadList end at "+System.currentTimeMillis()); } }class WriteList implements Runnable{ private List list; public WriteList(List list){ this.list = list; } @Override public void run(){ System.out.println("WriteList begin at "+System.currentTimeMillis()); synchronized (list){ System.out.println("get lock at "+System.currentTimeMillis()); list.notify(); System.out.println("list.notify() at "+System.currentTimeMillis()); try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("get out of block at "+System.currentTimeMillis()); } System.out.println("WriteList end at "+System.currentTimeMillis()); } }Java多线程的内置锁与显示锁介绍