《Java编程思想》读书笔记——并发

版权声明:本文为博主原创文章,转载请注明出处。 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. 唏必须有循环等待

    要发生死锁,这些条件必须同时满足;要防止死锁只需破坏其中一条

猜你喜欢

转载自blog.csdn.net/fgszdgbzdb/article/details/86078248