注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Search的博客

不断学习中!

 
 
 

日志

 
 

synchronized关键字的理解  

2013-03-14 13:19:21|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在Java中使用synchronized来实现同步,使用synchronized来修饰一个函数意味着为调用这个函数的对象加锁,
也就是说一旦有线程调用使用synchronized修饰的函数,那么这个线程就获得了这个对象的锁,在其他任何地方都不允许
这个对象调用其内部的同步方法,只有使用synchronized修饰的函数执行完毕以后,才有可能在其他线程中调用被加锁的对象
的同步方法,这里的加锁是对对象内的同步方法进行加锁,但是非同步方法却是可以调用的。
下面用例子来说明
package code.lxy.test;

public class DeadLockTest {
public synchronized void otherAction(DeadLockTest dl)
{
System.out.println("entering otherAction method.");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
dl.action();
}
private synchronized void action()
{
System.out.println("entering action method.");
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public  void test()
{
System.out.println("not synchronized method");
}
}
上述类中含有三个方法,两个同步的,一个非同步的,下面我们来对同步方法进行测试
package code.lxy.test;

public class MainClass {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
final DeadLockTest thread1=new DeadLockTest();
final DeadLockTest thread2=new DeadLockTest();
Thread threadA=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
thread1.otherAction(thread2);
}
});
threadA.start();
Thread threadB=new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
thread1.test();
}
});
threadB.start();
}
}
下面分析测试函数,划红线部分,调用了thread1内部的同步方法otherAction,也就意味着threadA获得了对象thread1对象锁,
在thread1函数没有执行完毕释放对象锁之前,在其他进程中是不能调用对象thread1内部的任意同步方法的,但是可以调用thread1
对象的非同步方法。如果我们在test方法之前加上关键字synchronized,那么这个程序就会一直等到otherAction同步方法执行完毕并释放
对thread1的对象锁时,以后才能够调用test方法,即使otherAction内部sleep,线程threadB拥有充足的时间片,它也无法执行,因为他们有thread1的对象锁,synchronized关键字的理解 - Search - Search的博客
 
相反如果没有synchronized关键字修饰,test方法将会立即执行不需要threadA释放对thread1对象的对象锁
synchronized关键字的理解 - Search - Search的博客
 
上述介绍的是使用synchronized来修饰函数,除了同步方法意外,synchronized关键字还能够用于同步代码块以及同步静态函数,
下面叙述同步程序块也就是变量时要注意的地方,查看如下链接。
http://developer.51cto.com/art/200906/132362.htm(关于同步代码块时,String类型变量所要注意的地方。)

  评论这张
 
阅读(125)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017