The Java synchronization thread did not work as expected
•
Java
The following code does not work properly:
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(); } }
When I run this program, I want LIST1 and List2 to contain 2000 items each, and the program takes about 2000 milliseconds However, many times I get a list of less than 2000 items, although it does complete in about 2000 milliseconds Sometimes I even get an arrayoutofbounds exception
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
I hope every lock in stageone and stagetwo should prevent threads from interfering with each other But this does not seem to be the case What's wrong with this code?
Solution
Your lock object is not static, so each thread synchronizes on a different monitor So the lock has no effect
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码