- 前言
- Java多线程通信方式
- 一、使用 volatile 关键字
- 二、使用Object类的wait()/notify()
- synchronized和lock的区别
前言 Java多线程通信方式 一、使用 volatile 关键字
基于volatile关键字来实现线程间相互通信是使用共享内存的思想。大致意思就是多个线程同时监听一个变量,当这个变量发生改变的时候,线程能够感知并执行相应的业务。
二、使用Object类的wait()/notify()Object类提供了线程间通信的方法:wait()、notify()、notifyAll(),它们是多线程通信的基础。
注:wait/notify 必须配合 synchronized 使用,wait 方法释放锁,notify 方法不释放锁。wait 是指在一个已经进入了同步锁的线程内,让自己暂时让出同步锁,以便其他正在等待此锁的线程可以得到同步锁并运行,只有其他线程调用了notify(),notify 并不释放锁,只是告诉调用过 wait() 的线程可以去参与获得锁的竞争了,但不是马上得到锁,因为锁还在别人手里,别人还没释放,调用 wait() 的一个或多个线程就会解除 wait 状态,重新参与竞争对象锁,程序如果可以再次得到锁,就可以继续向下运行。
synchronized和lock的区别
1、synchronized是Java的关键字,在JVM层面。lock是一个类,接口。 2、synchronized是隐式加锁,lock是显式的加锁。 3、synchronized可以作用在方法和代码块上,而lock只能作用在代码块上。 4、synchronized作用在静态方法上锁的是当前类的class,作用在普通方法上锁的是当前类的对象。 5、synchronized在发生异常的时候会自动释放占有的锁,因此不会出现死锁; 而lock发生异常的时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。 (所以最好将同步代码块用 try catch 包起来,finally中写入unlock,避免死锁的发生)



