Class Sync {private byte[] lock = new Byte[0]; public void Sync () throws Interruptedexception {synchronized (lock) {runthread (); }} public void Thissync () throws Interruptedexception {synchronized (this) {runthread (); }} public synchronized static void Staticsync () throws Interruptedexception {//synchronous static function Runthread (); } public void Classsync () throws Interruptedexception {//synchronized (Sync.class) {Runthread ( ); }} private static void Runthread () throws Interruptedexception {Thread current = Thread.CurrentThread (); System.out.println ("Current thread ID:" + current.getid () + "Enter ..."); System.out.println ("1111"); Thread.Sleep (1000); System.out.println ("2222"); Thread.Sleep (1000); System.out.println ("3333"); Thread.Sleep (1000); System.out.println ("4444"); Thread.Sleep (1000); System.Out.println ("5555"); System.out.println ("Current thread ID:" + current.getid () + "out ..."); }}
1. Whether the same thread lock object locks are reusable (that is, do not wait)
CONCLUSION: REUSABLE
public class Testobjectsynclock { private static byte[] lock = new byte[0];//0 Length byte array object will be created more economically than any object. View compiled bytecode: Generate 0-length byte[] objects with only 3 opcode, and object lock = new Object () requires 7 lines of opcode. Public static void Main (string[] args) throws Interruptedexception { //1. The same thread lock object locks are reusable (that is, do not wait)----REUSABLE synchronized (lock) { new Thread (new Runnable () {public void run () { try { thread.sleep ()}; } catch (Interruptedexception e) { e.printstacktrace (); } System.out.println ("AAA"); } ). Start (); Lock.notify (); } Synchronized (lock) { System.out.println ("BBB"); Lock.wait ();}}}
Results:
Bbb
Aaa
2. Same object, multi-threaded access (one main thread, one new thread)
Conclusion: The lock is effective
Thread current = Thread.CurrentThread (); System.out.println ("Current thread ID:" +current.getid () + "start ..."); Final sync Sync =new sync (); New Thread (New Runnable () {public void run () { Thread current = Thread.CurrentThread (); System.out.println ("Current thread ID:" +current.getid () + "start ..."); try { sync.sync (); } catch (Interruptedexception e) { e.printstacktrace ();}}} ). Start (); Sync.sync ();
Results:
Current thread Id:1start ...
Current thread Id:1enter ...
1111
Current thread Id:9start ...
2222
3333
4444
5555
Current thread id:1out ...
Current thread Id:9enter ...
1111
2222
3333
4444
5555
Current thread id:9out ...
3. Different objects, multi-threaded access
Conclusion: Lock is invalid
Thread current = Thread.CurrentThread (); System.out.println ("Currret thread ID:" + current.getid () + "start ..."); Final Sync sync = new sync (); Final Sync sync2 = new sync (); New Thread (New Runnable () {public void run () { Thread current = Thread.CurrentThread (); System.out.println ("Currret thread ID:" + current.getid () + "start ..."); try { sync2.sync (); } catch (Interruptedexception e) { e.printstacktrace ();}}} ). Start (); Sync.sync ();
Results:
Currret Thread Id:1start ...
Current thread Id:1enter ...
1111
Currret Thread Id:9start ...
Current thread Id:9enter ...
1111
2222
2222
3333
3333
4444
4444
5555
Current thread id:1out ...
5555
Current thread id:9out ...
4.wait (), notify ()----call wait or notify, the thread must be the owner of the lock on the object, or it will throw a exception in thread "Thread-0" Java.lang.IllegalMonitorStateException
New Thread (New Runnable () {public void run () { System.out.println ("------"); Synchronized (lock) { try { thread.sleep], } catch (Interruptedexception e) { e.printstacktrace ( ); } Lock.notify (); System.out.println ("After notify ...");}} ). Start (); Synchronized (lock) { System.out.println ("Enter ..."); Lock.wait (); System.out.println ("Out ...");
Results:
Enter ...
------
After notify ...
Out ...
5.wait (), Notifyall ()----notifyall () wakes up all the different threads in wait
New Thread (New Runnable () {public void run () {synchronized (lock) {Sys Tem.out.println ("Enter thread 1 ..."); try {lock.wait (); } catch (Interruptedexception e) {e.printstacktrace (); } System.out.println ("Leave thread 1 ..."); }}). Start (); New Thread (New Runnable () {public void run () {synchronized (lock) {System. Out.println ("Enter thread 2 ..."); try {lock.wait (); } catch (Interruptedexception e) {e.printstacktrace (); } System.out.println ("Leave thread 2 ..."); }}). Start (); New Thread (New Runnable () {public void run () {System.out.priNTLN ("------"); Synchronized (lock) {try {thread.sleep (3000); } catch (Interruptedexception e) {e.printstacktrace (); } lock.notifyall ();//The Notifyall method wakes all threads that are waiting for control of the object. Lock.notify ();//randomly notifies a waiting thread System.out.println ("after notifyall ..."); }}). Start ();
Results:
Enter Thread 1 ...
Enter Thread 2 ...
------
After Notifyall ...
Leave thread 2 ...
Leave thread 1 ...
6.static synchronization methods, different objects
Thread current = Thread.CurrentThread (); System.out.println ("Currret thread ID:" + current.getid () + "start ..."); Sync sync = new sync (); New Thread (New Runnable () {public void run () { sync sync = new sync (); Thread current = Thread.CurrentThread (); System.out.println ("Currret thread ID:" + current.getid () + "start ..."); try { sync.staticsync ();//Lock valid/ /Sync.staticsync ();//Lock valid //Sync.sync ();//Lock Invalid } catch ( Interruptedexception e) { e.printstacktrace ();}}} ). Start (); Sync.staticsync ();//Lock valid //Sync.staticsync ();//Lock valid //Sync.sync ();//Lock invalid
Results:
Currret Thread Id:1start ...
Current thread Id:1enter ...
1111
Currret Thread Id:9start ...
2222
3333
4444
5555
Current thread id:1out ...
Current thread Id:9enter ...
1111
2222
3333
4444
5555
Current thread id:9out ...
7.class synchronization methods, different objects
Thread current = Thread.CurrentThread (); System.out.println ("Currret thread ID:" + current.getid () + "start ..."); Sync sync = new sync (); New Thread (New Runnable () {public void run () { sync sync = new sync (); Thread current = Thread.CurrentThread (); System.out.println ("Currret thread ID:" + current.getid () + "start ..."); try { sync.classsync ();//Lock valid } catch (Interruptedexception e) { e.printstacktrace ();}}} ). Start (); Sync.classsync ();//Lock valid
Results:
Currret Thread Id:1start ...
Current thread Id:1enter ...
1111
Currret Thread Id:9start ...
2222
3333
4444
5555
Current thread id:1out ...
Current thread Id:9enter ...
1111
2222
3333
4444
5555
Current thread id:9out ...
8.this synchronous method, different objects, like 2, Object lock
Final Sync sync = new sync (); New Thread (New Runnable () {public void run () {//sync Sync =new sync (); Thread current = Thread.CurrentThread (); System.out.println ("Currret thread ID:" + current.getid () + "start ..."); try {sync.thissync (); } catch (Interruptedexception e) {e.printstacktrace (); }}). Start (); New Thread (New Runnable () {public void run () {//sync Sync =new sync (); Thread current = Thread.CurrentThread (); System.out.println ("Currret thread ID:" + current.getid () + "start ..."); try {sync.thissync (); } catch (Interruptedexception e) {e.printstacktrace (); }}). Start ();
Results:
Currret Thread Id:9start ...
Current thread Id:9enter ...
1111
Currret Thread Id:10start ...
2222
3333
4444
5555
Current thread id:9out ...
Current thread Id:10enter ...
1111
2222
3333
4444
5555
Current thread id:10out ...
Java synchronization Mechanism object lock usage Comparison