public class MyRunnable implements Runnable {
private Foo foo = newFoo();
public static void main(String[] args) {
MyRunnable r = new MyRunnable();
Thread ta = new Thread(r, "Thread-A");
Thread tb = new Thread(r, "Thread-B");
ta.start();
tb.start();
}
public class Test {
public static void main(String[] args) {
final NameListnl = new NameList();
nl.add("aaa");
classNameDropper extends Thread{
public void run(){
Stringname = nl.removeFirst();
System.out.println(name);
}
}
Thread t1 = new NameDropper();
Thread t2 = new NameDropper();
t1.start();
t2.start();
}
}
虽然集合对象
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);
}