多线程、同步、锁,搞死人了
——抛砖引玉、以下是我对同步的理解
:)欢迎大家拍砖.....
有线程的地方就有同步,有同步的地方就有对象监视器。
要记住——线程可以绑定到任意对象上,线程可以和对象关联这个机制就是同步
通俗讲:可以把线程挂到任意对象上,但是所有挂在此对象上的线程,同一时刻只有一个线程能到锁,得到锁的线程才能继续执行代码。
synchronized(obj) {//obj可以是new Object(),也可已是任意class,如:System.class
}
含义:把当前线程挂到obj上,但是obj上挂的所有线程中只有唯一的一个能得到obj锁、这个线程才能执行大括号内的代码。运行到右括号时,线程会自动释放obj的对象锁。
synchronized就是Thread进obj的门,拿到锁后,关门,其他人只能在门外等。Thread完事后,开门离开了,其他人才能进来。
关于object的等待、通知:
a thread run {
synchronized(obj) {//“a thread”挂到obj上,请求锁
//得到锁,
obj.wait();//wait,当前线程暂停(注意之前synchronized(obj)时已经把线程挂到obj上了),并释放锁。因为当前线程拥有obj的监视器,故不会抛异常:IllegalMonitorStateException
}
}
other thread run {
synchronized(obj) {//尝试获取obj的监视器,因为之前被“a thread”锁定了,故等待,直到obj.wait()执行释放了锁,"other thread"才能获取obj监视器。
//得到obj的锁
obj.notifyAll();//唤醒所有通过wait挂在obj上的对象线程,让他们竞争获取obj上的锁
// “other thread run”此时仍然持有obj的锁
}//释放obj上的锁,所有挂在obj上的线程开始竞争锁
}
///特别注意如果:other thread run中没有obj.notifyAll()这一句,那么任何obj.wait暂挂的线程,在other thread run 的同步块执行完毕后,因为还是暂挂状态,故不会参与锁的竞争,也就是说不会继续执行,永远的wait了。