版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/fgszdgbzdb/article/details/86078248
- join
如果A线程里,在线程B上调用join()方法,A线程挂起,直到B线程结束。
join方法可以使用超时参数
线程B可以被中断
{
// 当前线程A
b.join()// A在此处挂起
}
- synchronized
(对象锁)
对于同一个特定对象而言,其所有synchronized 方法共享同一个锁。
每个类也有一个锁
synchronized static 方法可以在类范围内防止多个对象对static数据的并发访问。
什么时候使用同步?
每个访问临界共享资源的方法都必须被同步
- volatile
第一选择是 synchronized
- 临界区(同步控制块)
public void method(){
// do sth
synchronized(syncObj){
// code here
}
}
-
线程状态
新建–new
就绪–runnable
阻塞–blocked
死亡–dead -
sleep()
sleep()的时候没有释放锁,yield()亦是如此。 -
wait()
wait()对象上的锁被释放,在该对象中的其他 synchronized方法可以在wait()期间被调用。这一点至关重要,其他方法通常会产生改变,而这些改变正式挂起任务重新被唤起锁感兴趣的。 -
notifyAll()
如果向对象x发送 notifyAll(),那么就必须在能获得x的锁的同步块中这么做
synchronized(x){
x.notifyAll();
}
notifyAll() 被调用时,并非唤醒所有等待的线程。事实上,当notifyAll()因某个特定的锁而被调用时,只有等待这个锁的任务才会被唤醒。
-
死锁
产生条件:
a. 互斥条件
b. 至少有一个任务持有一个资源且正等待被其他任务持有的另一资源
c. 资源不能被任务抢占
d. 唏必须有循环等待要发生死锁,这些条件必须同时满足;要防止死锁只需破坏其中一条