Java多线程的内置锁与显示锁介绍

这篇文章主要讲解了“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多线程的内置锁与显示锁介绍