Java deep learning 20: synchronized
First look at a common method without synchronizd decoration
public class SynTest implements Runnable { private static int count ; public SynTest() { this.count = 0; } @Override public void run() { for(int i=0; i<5; i++){ System.out.println(Thread.currentThread().getName() + ": " +(++count)); } } public static void main(String[] args) { SynTest synTest = new SynTest(); Thread thread1 = new Thread(synTest, "thread1"); Thread thread2 = new Thread(synTest, "thread2"); thread1.start(); thread2.start(); } } ---------------------日志-------------------------- thread1: 1 thread2: 1 thread1: 2 thread2: 3 thread2: 5 thread2: 6 thread1: 4 thread2: 7 thread1: 8 thread1: 9
Problem: Two threads are concurrent, competing for resources, causing (1) to obtain the same value (thread1: 1 and thread2: 1); (2) The order of output results is uncontrollable
1- Modify a code block
public class SynTest2 implements Runnable { private static int count ; public SynTest2() { this.count = 0; } @Override public void run() { synchronized (this){ for(int i=0; i<5; i++){ System.out.println(Thread.currentThread().getName() + ": " +(++count)); } } } public static void main(String[] args) { //方式1 SynTest2 synTest = new SynTest2(); Thread thread1 = new Thread(synTest, "thread1"); Thread thread2 = new Thread(synTest, "thread2"); thread1.start(); thread2.start(); //方式2 SynTest2 synTest1 = new SynTest2(); SynTest2 synTest2 = new SynTest2(); Thread thread3 = new Thread(synTest1, "thread3"); Thread thread4 = new Thread (synTest2, "thread4" ); thread3.start (); thread4.start (); } } ---------------------- Separate execution mode 1 log ---------------------- thread1: 1 thread1: 2 thread1: 3 thread1: 4 thread1: 5 thread2: 6 thread2: 7 thread2: 8 thread2: 9 thread2: 10 ---------------------- Individual execution method 2 log ------------------- --- thread3: 1 thread4: 2 thread3: 3 thread4: 4 thread3: 5 thread3: 7 thread3: 8 thread4: 6 thread4: 9 thread4: 10
END