j in multi-threading java keyword synchronized modified static method and non-static method get different situations

In java's synchronization keyword synchronized, we know that it is used in the case of multi-threaded synchronization and concurrency, and it is used to decorate methods or code blocks.

The modified method monitors the entire object, so if the modified method is a static method and a non-static method, is the effect the same?

Please see my example below

 

package com.test.thread;

public class SynchronizedClass {
   
   /**
	* Non-static synchronized method
 * @throws InterruptedException
   */
 public  synchronized void nonStaticFunction1() throws InterruptedException{
	for(int i=0;i<20;i++ ){
		Thread.sleep(300);
		System.out.println("nonstaticFunc1 is  running  times"+i);
	}	 
 }	
 /**
  * Non-static synchronized method
 * @throws InterruptedException
  */
 public  synchronized void nonStaticFunction2() throws InterruptedException{
		for(int i=0;i<20;i++ ){
			Thread.sleep(300);
			System.out.println("nonstaticFunc2 is  running  times"+i);
		}	 
 }
 /**
  * static synchronized method
 * @throws InterruptedException
  */
 public static synchronized void staticFunction() throws InterruptedException{
		for(int i=0;i<20;i++ ){
			Thread.sleep(300);
			System.out.println("staticFunc2 is  running  times"+i);
		}	 
 
 }
}

  Below is the test code

 

package com.test.thread;

public class SynchronizedTest {
  
	public static void main(String[] args) throws InterruptedException {
		final SynchronizedClass cls= new SynchronizedClass();
	    Thread t1=new Thread(){
	    	public void run() {
	    		try {
					cls.nonStaticFunction1();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace ();
				}
	    	};
	    };
	    
	    Thread t2=new Thread(){
	    	public void run() {
	    		try {
					cls.nonStaticFunction2();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace ();
				}
	    	};
	    };
	    Thread t3=new Thread(){
	    	public void run() {
	    		try {
					cls.staticFunction();
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace ();
				}
	    	};
	    };
	    t1.start();
	    t2.start();
	    t3.start();
	}
	
	
}

  The running result is as follows

nonstaticFunc1 is  running  times0
staticFunc2 is  running  times0
staticFunc2 is  running  times1
nonstaticFunc1 is  running  times1
staticFunc2 is  running  times2
nonstaticFunc1 is  running  times2
staticFunc2 is  running  times3
nonstaticFunc1 is  running  times3
staticFunc2 is  running  times4
nonstaticFunc1 is  running  times4
staticFunc2 is  running  times5
nonstaticFunc1 is  running  times5
staticFunc2 is  running  times6
nonstaticFunc1 is  running  times6
staticFunc2 is  running  times7
nonstaticFunc1 is  running  times7
staticFunc2 is  running  times8
nonstaticFunc1 is  running  times8
staticFunc2 is  running  times9
nonstaticFunc1 is  running  times9
staticFunc2 is  running  times10
nonstaticFunc1 is  running  times10
staticFunc2 is  running  times11
nonstaticFunc1 is  running  times11
staticFunc2 is  running  times12
nonstaticFunc1 is  running  times12
staticFunc2 is  running  times13
nonstaticFunc1 is  running  times13
staticFunc2 is  running  times14
nonstaticFunc1 is  running  times14
staticFunc2 is  running  times15
nonstaticFunc1 is  running  times15
staticFunc2 is  running  times16
nonstaticFunc1 is  running  times16
staticFunc2 is  running  times17
nonstaticFunc1 is  running  times17
staticFunc2 is  running  times18
nonstaticFunc1 is  running  times18
staticFunc2 is  running  times19
nonstaticFunc1 is  running  times19
nonstaticFunc2 is  running  times0
nonstaticFunc2 is  running  times1
nonstaticFunc2 is  running  times2
nonstaticFunc2 is  running  times3
nonstaticFunc2 is  running  times4
nonstaticFunc2 is  running  times5
nonstaticFunc2 is  running  times6
nonstaticFunc2 is  running  times7
nonstaticFunc2 is  running  times8
nonstaticFunc2 is  running  times9
nonstaticFunc2 is  running  times10
nonstaticFunc2 is  running  times11
nonstaticFunc2 is  running  times12
nonstaticFunc2 is  running  times13
nonstaticFunc2 is  running  times14
nonstaticFunc2 is  running  times15
nonstaticFunc2 is  running  times16
nonstaticFunc2 is  running  times17
nonstaticFunc2 is  running  times18
nonstaticFunc2 is  running  times19

  

From the above results, it can be seen that the static method staticFunc2 and the non-static method nonstaticFunc1 are executed alternately, while the non -static method nonstaticFunc1 and nonstaticFunc2 are executed sequentially.

The objects monitored by static methods and non-static methods are different. We know that the static method belongs to the class object, so the object it monitors is the Class class, and the non-static method belongs to the object itself, so the object it monitors is the object itself

 

 

 

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=326682639&siteId=291194637