multithreading synchronization problem with synchronized keyword in Java
in Java, multi-threading synchronization relies on the object lock mechanism, the Synchronized keyword is the use of encapsulating object locks to achieve mutually exclusive access to shared resources.
The following is a simple example of multithreading synchronization problem, we want to add the Synchronized keyword in the run () method to achieve mutually exclusive access.
Package Com.clark.thread;public class MyThread implements runnable{private int threadId; public MyThread (int id) {this.threadid = ID; } @Override public synchronized void Run () {//At this time the keyword synchronized is locked by the This object, that is, the currently running thread object itself for (int i = 0; I < 100; i++) {if (i% ==0) {System.out.println (); } System.out.print ("Thread ID:" +this.threadid+ ":" +i+ ""); } }}
Test class:
Package Com.clark.thread;public class Threaddemo {public static void main (string[] args) throws Interruptedexception {
//code, and each thread holds an object lock on this object, which does not enable thread synchronization. for (int i = 0; i < i++) {new Thread (new MyThread (i)). Start (); Thread.Sleep (1); }}}
The Print Results section is as follows: Its threads are not mutually exclusive access. Therefore did not achieve the resource multithreading synchronization effect ...
from the above, to realize thread synchronization, these threads must be allowed to compete for a unique shared object lock.
Package Com.clark.thread;public class MyThread implements Runnable{private int threadid;private Object object;// Object locks between threads used by public MyThread (int Id,object object) {This.threadid = Id;this.object = object;} @Overridepublic void Run () {/** * passes a reference to the object object to the lock member variable of each thread's objects * so that each thread's lock member points to the same object object * This allows the thread to compete for this unique shared object lock for synchronization. */synchronized (object) {for (int i = 0; i <; i++) {if (i% ==0) {System.out.println ();} System.out.print ("Thread ID:" +this.threadid+ ":" +i+ "");}}}}
Package Com.clark.thread;public class Threaddemo {public static void main (string[] args) throws Interruptedexception {OBJ ECT obj = new Object (); for (int i = 0; i < i++) {new Thread (new MyThread (I,obj)). Start (); Thread.Sleep (1);}}
The test results are as follows:
Thread id:5:60 thread id:5:61 thread id:5:62 thread id:5:63 thread id:5:64 thread id:5:65 thread id:5:66 thread id:5:67 Th Read id:5:68 thread id:5:69 thread id:5:70 thread id:5:71 thread id:5:72 thread id:5:73 thread id:5:74 thread id:5:75 thre Ad id:5:76 thread id:5:77 thread id:5:78 thread id:5:79 thread id:5:80 thread id:5:81 thread id:5:82 thread id:5:83 thread id:5:84 thread id:5:85 thread id:5:86 thread id:5:87 thread id:5:88 thread id:5:89 thread id:5:90 thread id:5:91 thread I d:5:92 thread id:5:93 thread id:5:94 thread id:5:95 thread id:5:96 thread id:5:97 thread id:5:98 thread id:5:99 thread ID: 6:0 thread id:6:1 thread id:6:2 thread id:6:3 thread id:6:4 thread id:6:5 thread id:6:6 thread id:6:7 thread Id:6:8 thread Id:6:9 thread id:6:10 thread id:6:11 thread id:6:12 thread id:6:13 thread id:6:14 thread id:6:15 thread id:6:16 thread ID : 6:17 thread id:6:18 thread id:6:19 thread id:6:20 thread id:6:21 thread id:6:22 thread id:6:23 thread id:6:24 thread Id:6 : Thread id:6:26 Thread id:6:27 thread id:6:28 thread id:6:29
The second code shows that the key to synchronization is that multiple thread objects compete for the same shared resource, and the code above is implemented externally by creating shared resources and then passing them to the thread. We can also use class member variables to share this feature with instances of all classes, so you can Lock implemented with static member objects , the code looks like this:Modify the Mythread.java class as follows
Package Com.clark.thread;public class MyThread implements Runnable{private int Threadid;private static Object object = New Object lock public MyThread (int id) {This.threadid = id) used for contention between threads; @Overridepublic void Run () {<strong>/** * passes a reference to the object object to the lock member variable of each thread's objects * so that each thread's lock member points to the same object object * This allows the thread to compete for this unique shared object lock for synchronization. */</strong>synchronized (object) {for (int i = 0; i <; i++) {if (i% ==0) {System.out.println ();} System.out.print ("Thread ID:" +this.threadid+ ":" +i+ "");}}}}
The results are as follows:
Take a look at the first piece of code, add the instance method sychronized the keyword blocked is This object itself, and adding it in a static method sychronized the keyword block is the class itself. static methods are shared by all class instance objects, so thread objects are mutually exclusive access to this static method, allowing for thread synchronization, as shown in the following code:
Package Com.clark.thread;public class MyThread implements Runnable{private int threadid;public MyThread (int id) { This.threadid = ID;} @Overridepublic void Run () {start (this.threadid);} private static synchronized void start (int threadId2) {for (int i = 0; i <; i++) {if (i% = = 0) {System.out.printl n ();} System.out.print ("Thread ID:" +threadid2+ ":" +i+ "");}}}
The results are as follows =========
thread ID:0:0 Thread id:0:1 thread id:0:2 thread id:0:3 thread id:0:4 thread id:0:5 thread id:0:6 thread id:0:7 thread id:0:8 thread ID: 0:9 thread id:0:10 thread id:0:11 thread id:0:12 thread id:0:13 thread id:0:14 thread id:0:15 thread id:0:16 thread id:0:1 7 thread id:0:18 thread id:0:19 thread id:0:20 thread id:0:21 thread id:0:22 thread id:0:23 thread id:0:24 thread id:0:25 Thread id:0:26 thread id:0:27 thread id:0:28 thread id:0:29 thread id:0:30 thread id:0:31 thread id:0:32 thread id:0:33 Th Read id:0:34 thread id:0:35 thread id:0:36 thread id:0:37 thread id:0:38 thread id:0:39 thread id:0:40 thread id:0:41 thre Ad id:0:42 thread id:0:43 thread id:0:44 thread id:0:45 thread id:0:46 thread id:0:47 thread id:0:48 thread id:0:49 thread ID:0:50 thread id:0:51 thread id:0:52 thread id:0:53 thread id:0:54 thread id:0:55 thread id:0:56 thread id:0:57 thread I d:0:58 Thread id:0:59
Multithreading synchronization problem with synchronized keyword in Java