`
fengan321
  • 浏览: 3270 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

synchronized在用法

 
阅读更多
1。synchronized 方法控制对类成员变量的访问:synchronized方法
public synchronized void accessVal(int newVal){}
2。synchronized代码块控制对类的静态成员变量的访问。
synchronized(syncObject) {
//允许访问控制的代码
}
  synchronized 块是这样一个代码块,其中的代码必须获得对象 syncObject (如前所述,可以是类实例或类)的锁方能执行,具体机制同前所述。由于可以针对任意代码块,且可任意指定上锁的对象,故灵活性较高。

notify()及notifyAll()是Object的方法,与Object的wait()方法配合使用,而且这三个方法必须在同步块中调用.



如下:
在线程1中执行如下代码

Java代码
...  
synchronized(obj1) //1.进入同步块  
{  
try {  
...  
obj1.wait(); //2.进入暂停状态  
}catch (InterruptedException exp) {}  


...
synchronized(obj1) //1.进入同步块
{
try {
...
obj1.wait(); //2.进入暂停状态
}catch (InterruptedException exp) {}



1.当前同步对象(monitor)为obj1,obj1是任一实例,若是同步方法,则同步对象是this。进入同步块后,obj1为锁定状态,锁定状态对obj1本身无任何影响,而其它线程执行到同一代码时,因不能获得锁,处于Block状态,一旦解锁,被block的线程自动继续执行。
2.调用obj1.wait()有两个作用,一是使线程进入等待状态,二是解锁obj1。这时被block的线程将获得锁,线程1要退出等待必须要由其它线程显式的调用obj1.notify()或notifyAll()方法。





Java代码
...  
synchronized(obj1)  
{  
...  
obj1.notify(); //3. 向wait的线程发通知信息  
...  
}  
... 

...
synchronized(obj1)
{
...
obj1.notify(); //3. 向wait的线程发通知信息
...
}
...若其它线程执行到此时,线程1处于wait状态,则wait状态解除,解除后,线程1若得到锁就能继续执行,若有多个线程处于obj1的wait状态,notify将随机选一个线程激活,而notifyAll是同时解除所有的wait状态。
notifyAll() 让等待某个对象K的所有线程离开阻塞状态,
notify() 随机地选取等待某个对象K的线程,让它离开阻塞状态。




分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics