Java的线程通信基础
java线程通信介绍
- java通信一般是会采用共享变量。
- 使用共享变量就会有安全问题,就会产生锁(syncronized)。
- 使用了锁就会有线程的等待和唤醒问题。
这一节介线程的等待和唤醒问题
被弃用的supend和resume
- supend/resume是在线程(Thread类中的)所以和锁是没关系的
- supend/resume 是解决不了变量的共享问题所以就会引入锁(syncronized)的概念
- supend/resume 加上锁就会导致死锁的问题(因为是单纯的线程等待和唤醒) 线程等待是会占用此线程锁的
- supend/resume 先进行resume之后再supend还是会进行阻塞的。
综合以上的特性是不建议使用的
wait和notify/notifyAll
- wait和notify/notifyAll 是在Object类中
- wait和notify/notifyAll 必须和syncronized一起使用 (因为wait会释放对象锁的)
- wait和notify/notifyAll 也是会有supend/resume 问题 如果线程先唤醒之后在wait是没有办法再次唤醒的除非再调用notify
特点:和syncronized绑定了有局限,但是会自动释放对象锁
park和unpark
- park和unpark是在LockSupport类中 提供的API也是单纯的等待和唤醒操作
- park和unpark 可以单独使用和锁是没有关系的
- park和unpark 解决了 supend/resume 问题 如果线程先unpark之后在park是可以直接往下运行的
注意:unpark的是不叠加的