快速业务通道

Java线程:线程的同步 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
ons.synchronizedList(new LinkedList());     public void add(String name) {         nameList.add(name);     }     public String removeFirst() {         if (nameList.size() > 0) {             return (String) nameList.remove(0);         } else {             return null;         }     } } public class Test {     public static void main(String[] args) {         final NameList nl = new NameList();         nl.add("aaa");         class NameDropper extends Thread{             public void run(){                 String name = nl.removeFirst();                 System.out.println(name);             }         }         Thread t1 = new NameDropper();         Thread t2 = new NameDropper();         t1.start();         t2.start();     } }

Java线程:线程的同步(5)

时间:2010-12-08 BlogJava Werther

虽然集合对象

private List nameList = Collections.synchronizedList(new LinkedList());

是同步的,但是程序还不是线程安全的。

出现这种事件的原因是,上例中一个线程操作列表过程中无法阻止另外一个 线程对列表的其他操作。

解决上面问题的办法是,在操作集合对象的NameList上面做一个同步。改写 后的代码如下:

public class NameList {     private List nameList = Collections.synchronizedList(new LinkedList());     public synchronized void add(String name) {         nameList.add(name);     }     public synchronized String removeFirst() {         if (nameList.size() > 0) {             return (String) nameList.remove(0);         } else {             return null;         }     } }

这样,当一个线程访问其中一个同步方法时,其他线程只有等待。

七、线程死锁

死锁对Java程序来说,是很复杂的,也很难发现问题。当两个线程被阻塞, 每个线程在等待另一个线程时就发生死锁。

还是看一个比较直观的死锁例子:

public class DeadlockRisk {     private static class Resource {         public int value;     }     private Resource resourceA = new Resource();     private Resource resourceB = new Resource();     public int read() {         synchronized (resourceA) {             synchronized (resourceB) {                 return resourceB.value + resourceA.value;             }         }     }     public void write(int a, int b) {         synchronized (resourceB) {             synchronized (resourceA) {                 resourceA.value = a;                 resourceB.value = b;             }         }     } }

假设read()方法由一个线程启动,write()方法由另外一个线程启动。读线程 将拥有resourceA锁,写线程将拥有resourceB锁,两者都坚持等待的话就出现死 锁。

实际上,上面这个例子发生死锁的概率很小。因为在代码内的某个点,CPU必 须从读线程切换到写线程,所以,死锁基本上不能发生。

但是,无论代码中发生死锁的概率有多小,一旦发生死

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号