以下代码无法正常工作:
import java.util.ArrayList; import java.util.List; import java.util.Random; class Worker implements Runnable { public void run() { System.out.println("Started."); process(); } private Random random = new Random(); private Object lock1 = new Object(); private Object lock2 = new Object(); private static List<Integer> list1 = new ArrayList<Integer>(); private static List<Integer> list2 = new ArrayList<Integer>(); public void stageOne() { synchronized (lock1) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } list1.add(random.nextInt(100)); } } public void stageTwo() { synchronized (lock2) { try { Thread.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); } list2.add(random.nextInt(100)); } } public void process() { for(int i=0; i<1000; i++) { stageOne(); stageTwo(); } } public static void show() { System.out.println("List1: " + list1.size()); System.out.println("List2: " + list2.size()); } } public class JavaTest { public static void main(String[] args) { long start = System.currentTimeMillis(); Thread t1 = new Thread(new Worker()); t1.start(); Thread t2 = new Thread(new Worker()); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("Completed."); long end = System.currentTimeMillis(); System.out.println("Time taken: " + (end - start)); Worker.show(); } }@H_404_4@当我运行这个程序时,我希望list1和list2每个包含2000个项目,并且程序需要大约2000毫秒.然而,很多时候我得到的列表少于2000个项目,尽管它确实在2000毫秒左右完成.有时我甚至会得到一个ArrayOutOfBounds异常
Started. Started. Exception in thread "Thread-1" java.lang.ArrayIndexOutOfBoundsException: 163 at java.util.ArrayList.add(ArrayList.java:459) at Worker.stageOne(JavaTest.java:34) at Worker.process(JavaTest.java:53) at Worker.run(JavaTest.java:14) at java.lang.Thread.run(Thread.java:748) Completed. Time taken: 2217 List1: 1081 List2: 1079@H_404_4@我希望stageOne和stageTwo中的每个锁都应该阻止线程相互干扰.但事实似乎并非如此.这段代码有什么问题?
解决方法
您的锁定对象不是静态的,因此每个线程在不同的监视器上进行同步.所以锁没有任何影响.