线程的同步就相当于只有一个浴室(共用资源)。但是很多人要洗澡(线程),所以为了避免同一时间段有多人拥入浴室,在一个人进入浴室的时候把门锁起来,这样其他人只能等待,等那人洗好开了门才能进入下一个
实现的话就是给你线程中访问共用资源的代码段加上
public void run()
{
synchronized(Object)//括号内为监听的共用资源对象名,注意是对象不是类
{
//改变共用资源的语句
}
}
方法级同步:
- 实现方法:在要标志为同步的方法前加上synchronized关键字。
- 实现原理:当调用对象的同步方法时,线程取得对象锁或监视器;如果另一个线程试图执行任何同步方法时,他就会发现他被锁住了,进入挂起状态,直到对象监视器上的锁被释放时为止。当锁住方法的线程从方法中返回时,只有一个排队等候的线程可以访问对象。
代码块级同步:
- 临界区:需要进行互斥的代码段,而非整个方法。
- 实现方法:用synchronized来指定某个对象,此对象的锁被用来对花括号内的代码进行同步控制。
- 实现原理:在进入同步代码前,必须得到object对象的锁,如果其他线程已经得到这个锁,那么就得等到锁被释放后才能进入临界区。
- 锁的作用域:只在代码块运行的时间内。 |