浏览 3326 次
锁定老帖子 主题:同步心得
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (9)
|
|
---|---|
作者 | 正文 |
发表时间:2012-06-22
最后修改:2012-07-09
做多线程有段时间了,回首看自己原来的代码,很是sb,故在此做出点sb的总结 首先讨论下synchronized,也就是java的内部锁,这也是最常用的同步 个人理解,如有雷同,纯属倒霉。
。。。。。。
多谢各位批评,之前的观点的确有很大问题;为了避免误人子弟,我已经把之前的三点观点删除了,那么重新来整理一下java的synchronized。
首先从synchronized方法说起,在一个类中的所有synchronized方法都是共用的一把锁;例如当一个对象在一个进程中进入了同步方法,获得了对象锁(本人称其为对象锁,非专业名词),那么在其他进程中这个对象就进不了同步方法,直到第一个进程释放对象锁,但是可以访问其他的非同步方法,和public属性。
那么说一下本人误解最大的synchronized(this),这个只是同步块的一种写法,其实也是用的上边的那把锁-对象锁。当一个进程进入synchronized(this)块,其他的进程就无法进入synchronized(this)块,以及synchronized方法。
那个synchronized(object)同步块,object当然不止可以是this,可以是任何对象(非空对象),一般锁的是同步块所使用的资源。
同步块,还有一种写法是synchronized(object.class),这样是锁object这个类,那么这样只允许object的一个对象的一个进程获得这个类锁
下面贴出个demo,是synchronized(this)的测试,代码很简单,就不做什么解释了
public class CollectionSynchronize { public static void main(String[] args) { CollectionSynchronize co = new CollectionSynchronize(); final SynchThis synthis = co.new SynchThis(); ExecutorService exec = Executors.newFixedThreadPool(100); Runnable a = new Runnable() { @Override public void run() { // TODO Auto-generated method stub synthis.aa(); } }; Runnable b = new Runnable() { @Override public void run() { // TODO Auto-generated method stub synthis.bb(); } }; Runnable c = new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { Thread.sleep(100); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } synthis.b = 10000; System.out.println(synthis.getb()); } }; exec.submit(a); exec.submit(b); exec.submit(c); exec.shutdown(); } class SynchThis { public void aa() { synchronized (this) { System.out.println("获取this锁"); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("解锁this锁"); } } public synchronized void bb() { try { Thread.sleep(500); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("run work"); } public int b = 10; public int getb() { return b; } } }
希望能够得到跟多批评 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2012-06-23
第一条有错吧?什么叫"想用这个对象的什么都不成了",如果是对象非同步方法还是可以调用的呀
|
|
返回顶楼 | |
发表时间:2012-06-24
感觉,楼主应该还是没有明白什么叫做锁,呵呵
|
|
返回顶楼 | |
发表时间:2012-06-25
额,楼主需要先了解对象内部锁.
|
|
返回顶楼 | |
发表时间:2012-07-09
finallygo 写道 第一条有错吧?什么叫"想用这个对象的什么都不成了",如果是对象非同步方法还是可以调用的呀
多谢更正,已经认识到错误了,希望能给更多意见 |
|
返回顶楼 | |
发表时间:2012-07-09
skydream 写道 感觉,楼主应该还是没有明白什么叫做锁,呵呵
呵呵,我是入门小白,已经更正了,希望能给更多意见 |
|
返回顶楼 | |