JAVA 线程同步 线程间通信 线程死锁 线程控制

线程同步

实现多个线程同步访问同一个数据结构

为了防止多个线程同时访问同一个数据结构导致数据结构被破坏,同一时间只允许一个线程操作这个数据结构,使用监视器(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

猜你喜欢

转载自blog.csdn.net/weixin_42129080/article/details/80679797