一、锁同步
但我们需要多线程对某个资源进行顺序执行时候,这个时候就需要一把同步锁。
一个锁同一时间只能被一个线程持有。也就是说一个锁如果被一个线程所持有,那其他线程如果需要得到这个锁,就得等这个线程释放该锁
二、等待/通知机制
基于锁的方式,线程需要不断的尝试获得锁,如果失败了,再继续尝试,这会消耗服务器资源,而等待/通知机制是另一种方式
等待/通知机制是基于Object类的wait()和notify(),notifyall()方法来实现的.
notify():随机叫醒一个正在等待的线程
notifyaAll()叫醒所有等待的线程
一个线程叫醒另一个线程使用notify(),叫醒以后,使用wait()方法陷入等待并且释放锁
注意:等待/通知机制的使用是使用同一个对象锁,如果两个线程使用的是不同对象锁,那么他们之间不能用等待/通知机制通信的
三、信号量-volatile
用来保证两个或者多个关键代码不被并发调用。在进入一个关键代码之前,线程必须获取一个信号量,一旦关键代码完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待知道第一个线程释放信号量
volatile保证了内存的可见性,用volatile声明了一个变量,在一个线程里面改变了这个变量的值,那其它线程是立马可见更改后的值
volatile声明的变量需要进行原子操作,因此对于该变量值的修改需要加上锁。
四、Thread.join()
作用是让当前线程陷入等待状态,等join的这个线程执行完成后,再继续执行当前线程。