Java deep learning 20: synchronized

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

Guess you like

Origin www.cnblogs.com/wobuchifanqie/p/12758338.html