线程同步
实现多个线程同步访问同一个数据结构
为了防止多个线程同时访问同一个数据结构导致数据结构被破坏,同一时间只允许一个线程操作这个数据结构,使用监视器(monitor),Java每个对象都有一个监视器,可以将线程lock/unlock,监视器上的锁同时只能由一个线程持有。
同步块(synchronized block)语法:持有objectidentifier对象的监视器关联的锁
synchronized(objectidentifier) {
// Access shared variables and other shared resources
}
线程间通信
三个方法都在类Object中作为final方法实现,只能在synchronized关键字的上下文中使用这三种方法
Sr.No. | Method & Description |
---|---|
1 | public void wait() 使得当前线程处于waiting状态,直到有其他线程调用notify(). |
2 | public void notify() 唤醒在对象的监视器等待的随机一个单独线程. |
3 | public void notifyAll() 唤醒同一个对象上处于wating状态的所有线程. |
线程死锁
多线程互相等待,永远阻塞
可能是synchronized关键字导致正在执行的线程阻塞且未释放锁,且其他线程等待正在执行的线程释放锁,造成死锁
线程控制
Java允许对多线程实现完全控制,使用以下方法,但suspend/resume/stop方法已被抛弃
Sr.No. | Method & Description |
---|---|
1 | public void suspend() 使线程处于暂停状态,可以被resume()方法恢复. |
2 | public void stop() 完全终止一个线程,可能会导致对象不一致. |
3 | public void resume() 恢复suspend()暂停的线程. |
4 | public void wait() 使得当前线程处于waiting状态,直到有其他线程调用notify(). |
5 | public void notify() 唤醒在对象的监视器等待的随机一个单独线程. |
wait()和sleep()的不同
1. wait()是object的final方法,sleep()是Thread的靜態方法
2. wait()釋放鎖,sleep()不釋放鎖
3. wait()用來綫程之間通信,sleep()衹是將綫程執行暫停
Reference:https://www.tutorialspoint.com/java/java_multithreading.htm