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