专注于快乐的事情

java线程状态总结

线程的各种状态

线程的状态跃迁

线程的状态图

锁(monitor)池和等待池

在java中,每个对象都有两个池,锁(monitor)池和等待池

锁池:假设线程A已经拥有了某个对象(注意:不是类)的锁,而其它的线程想要调用这个对象的某个synchronized方法(或者synchronized块),由于这些线程在进入对象的synchronized方法之前必须先获得该对象的锁的拥有权,但是该对象的锁目前正被线程A拥有,所以这些线程就进入了该对象的锁池中。

等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁(因为wait()方法必须出现在synchronized中,这样自然在执行wait()方法之前线程A就已经拥有了该对象的锁),同时线程A就进入到了该对象的等待池中。
如果另外的一个线程调用了相同对象的notifyAll()方法,那么处于该对象的等待池中的线程就会全部进入该对象的锁池中,准备争夺锁的拥有权。
同样,如果另外的一个线程调用了相同对象的notify()方法,那么仅仅有一个处于该对象的等待池中的线程(随机)会进入该对象的锁池.

##什么时候使用wait?

wait用来线程的协调。场景
1.如果有空间则写入数据,没有等候。
2.如空间已经有了,通知等候的线程。

有没有更好的协调方式?

##什么时候使用synchronized?

当一个线程正在执行synchronized方法时,其他线程无法执行该方法,这就是简单的共享互斥
互斥。

##sleep()和wait()的区别?

sleep()方法,方法是属于Thread类中的。而wait()方法,则是属于Object类中的。
Thread.sleep不会导致锁行为的改变。
sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监控状态依然保持者,当指定的时间到了又会自动恢复运行状态。在调用sleep()方法的过程中,线程不会释放对象锁
调用wait()方法的时候,线程会放弃对象锁,进入等待此对象的等待锁定池。

参考

http://blog.csdn.net/jiangwei0910410003/article/details/19962627

评论系统未开启,无法评论!