[java]synchronized我的理解

多线程、同步、锁,搞死人了

——抛砖引玉、以下是我对同步的理解

:)欢迎大家拍砖.....

 

有线程的地方就有同步,有同步的地方就有对象监视器。

 

要记住——线程可以绑定到任意对象上,线程可以和对象关联这个机制就是同步


通俗讲:可以把线程任意对象上,但是所有挂在此对象上的线程,同一时刻只有一个线程能到锁,得到锁的线程才能继续执行代码。


 

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了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值