Java同步块(Synchronized Blocks)
- - 并发编程网 - ifeve.com原文链接 作者:Jakob Jenkov 译者:李同杰. Java 同步块(synchronized block)用来标记方法或者代码块是同步的. Java同步关键字(synchronzied). Java 同步关键字( synchronized ). Java中的同步块用synchronized标记.
/**************************************************************************************** Copyright © 2014 Your Company/Org. All rights reserved.<br> Reproduction or transmission in whole or in part, in any form or<br> by any means, electronic, mechanical or otherwise, is prohibited<br> without the prior written consent of the copyright owner. <br> ****************************************************************************************/ package com.beston.concurrency.synchronization; /** * @ClassName: SyncMethod * @Description: 同步方法 synchronized syncMethod(){...} * 作用域:某个对象实例内,可以防止多个线程同时访问这个对象的synchronized方法 * 如果一个对象有多个synchronized方法,只要一个线 程访问了其中的一个synchronized方法, * 其它线程不能同时访问这个对象中任何一个synchronized方法.这时,不同的对象实例的 synchronized方法是不相干扰的。 * 也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法; * @author beston * @date 2014年3月17日 下午4:19:32 * @version v1.0 * */ public class SyncMethod { public static void main(String[] args) { MethodObj obj = new MethodObj(); //线程1执行 hello()和syncmethod1()方法 new Thread(new Runnable1(obj)).start(); //线程2执行 hello()和syncmethod2()方法 new Thread(new Runnable2(obj)).start(); } } /** * @ClassName: Runnable1 * @Description: 执行 hello()和syncmethod1()方法 * @author beston * @date 2014年3月17日 下午4:29:49 * @version v1.0 * */ class Runnable1 implements Runnable{ private MethodObj obj; public Runnable1(MethodObj obj){ this.obj= obj; } public void run(){ obj.hello(); obj.syncmethod1(); } } /** * @ClassName: Runnable2 * @Description: 执行 hello()和syncmethod2()方法 * @author beston * @date 2014年3月17日 下午4:29:07 * @version v1.0 * */ class Runnable2 implements Runnable{ private MethodObj obj; public Runnable2(MethodObj obj){ this.obj= obj; } public void run(){ obj.hello(); obj.syncmethod2(); } } class MethodObj{ /** * @Title: hello * @Description: 非同步,不会被锁 */ public void hello(){ System.out.println(Thread.currentThread().getName()+" hello!"); } /** * @Title: syncmethod1 * @Description: 同步方法1,被第一个持有该对象的线程占用5秒 */ public synchronized void syncmethod1(){ System.out.println(Thread.currentThread().getName()+" 占用 syncmethod1() 5秒"); try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } /** * @Title: syncmethod2 * @Description: 同步方法2 */ public synchronized void syncmethod2(){ System.out.println(Thread.currentThread().getName()+" syncmethod2()"); } }
/**************************************************************************************** Copyright © 2014 Your Company/Org. All rights reserved.<br> Reproduction or transmission in whole or in part, in any form or<br> by any means, electronic, mechanical or otherwise, is prohibited<br> without the prior written consent of the copyright owner. <br> ****************************************************************************************/ package com.beston.concurrency.synchronization; /** * @ClassName: SyncMethod * @Description: 同步块 synchronized(this){...} * 作用域: 锁定 当前对象this * @author beston * @date 2014年3月17日 下午4:19:32 * @version v1.0 * */ public class SyncThis { public static void main(String[] args) { ThisObj obj = new ThisObj(); //线程1执行 hello()和syncthis1()方法 new Thread(new Runnable3(obj)).start(); //线程2执行 hello()和syncthis2()方法 new Thread(new Runnable4(obj)).start(); } } /** * @ClassName: Runnable3 * @Description: 执行 hello()和syncthis1()方法 * @author beston * @date 2014年3月17日 下午4:29:49 * @version v1.0 * */ class Runnable3 implements Runnable{ private ThisObj obj; public Runnable3(ThisObj obj){ this.obj= obj; } public void run(){ obj.hello(); obj.syncthis1(); } } /** * @ClassName: Runnable4 * @Description: 执行 hello()和syncthis2()方法 * @author beston * @date 2014年3月17日 下午4:29:07 * @version v1.0 * */ class Runnable4 implements Runnable{ private ThisObj obj; public Runnable4(ThisObj obj){ this.obj= obj; } public void run(){ obj.hello(); obj.syncthis2(); } } class ThisObj{ /** * @Title: hello * @Description: 非同步,不会被锁 */ public void hello(){ System.out.println(Thread.currentThread().getName()+" hello!"); } /** * @Title: syncthis1 * @Description: 同步块1,被第一个持有该对象的线程占用5秒 */ public void syncthis1(){ synchronized(this){ System.out.println(Thread.currentThread().getName()+" 占用 syncthis1() 5秒"); try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * @Title: syncthis2 * @Description: 同步块2 */ public void syncthis2(){ synchronized(this){ System.out.println(Thread.currentThread().getName()+" syncthis2()"); } } }
/**************************************************************************************** Copyright © 2014 Your Company/Org. All rights reserved.<br> Reproduction or transmission in whole or in part, in any form or<br> by any means, electronic, mechanical or otherwise, is prohibited<br> without the prior written consent of the copyright owner. <br> ****************************************************************************************/ package com.beston.concurrency.synchronization; /** * @ClassName: SyncBlock * @Description: 同步块 synchronized(obj){...} * 锁定非自身(this)的其他对象,则只锁住该代码块,其他同步方法不受影响 * @author beston * @date 2014年3月17日 下午5:02:16 * @version v1.0 * */ public class SyncBlock { public static void main(String[] args) { BlockObj obj = new BlockObj(); //线程1执行 hello()和syncblock1()方法 new Thread(new Runnable5(obj)).start(); //线程2执行 hello()和syncblock1(),syncblock2()方法 new Thread(new Runnable6(obj)).start(); } } /** * @ClassName: Runnable5 * @Description: 执行 hello()和syncblock1()方法 * @author beston * @date 2014年3月17日 下午4:29:49 * @version v1.0 * */ class Runnable5 implements Runnable{ private BlockObj obj; public Runnable5(BlockObj obj){ this.obj= obj; } public void run(){ obj.hello(); obj.syncblock1(); } } /** * @ClassName: Runnable6 * @Description: 执行 hello()和syncblock1(),syncblock2()方法 * @author beston * @date 2014年3月17日 下午4:29:07 * @version v1.0 * */ class Runnable6 implements Runnable{ private BlockObj obj; public Runnable6(BlockObj obj){ this.obj= obj; } public void run(){ obj.hello(); obj.syncblock2(); obj.syncblock1(); } } class BlockObj{ Byte[] b = new Byte[0]; Object a = new Object(); int i = 0;//非对象 不能放到synchronized()括号中 /** * @Title: hello * @Description: 非同步,不会被锁 */ public void hello(){ System.out.println(Thread.currentThread().getName()+" hello!"); } /** * @Title: syncblock1 * @Description: 同步块,进入该方法线程占用5秒 */ public void syncblock1(){ synchronized(a){ System.out.println(Thread.currentThread().getName()+" 占用 syncblock1() 5秒"); try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * @Title: syncblock2 * @Description: 同步块 */ public void syncblock2(){ synchronized(b){ System.out.println(Thread.currentThread().getName()+" syncblock2()"); } } }
/**************************************************************************************** Copyright © 2014 Your Company/Org. All rights reserved.<br> Reproduction or transmission in whole or in part, in any form or<br> by any means, electronic, mechanical or otherwise, is prohibited<br> without the prior written consent of the copyright owner. <br> ****************************************************************************************/ package com.beston.concurrency.synchronization; import java.util.logging.Logger; /** * @ClassName: SynStaticMethod * @Description: 结论: 不同线程访问同一个类的静态同步方法时, 线程间是互斥的.其他非静态同步块和同步方法不受影响 * @author beston * @date 2014年3月17日 下午6:02:41 * @version v1.0 * */ public class SynStaticMethod { // 线程1 static class T1 implements Runnable { SynStaticMethod s; public T1(SynStaticMethod sameObj) { this.s = sameObj; } // 线程1访问静态同步方法 public void run() { SynStaticMethod.syn(); } } // 线程2 static class T2 implements Runnable { SynStaticMethod s; public T2(SynStaticMethod sameObj) { this.s = sameObj; } // 线程2访问静态同步方法 public void run() { //SynStaticMethod.static2();不会阻塞 //SynStaticMethod.syn2(); //new SynStaticMethod().synInstance3(); //new SynStaticMethod().syn(); //SynStaticMethod.syn(); } } // 对象的静态同步方法 public static synchronized void syn() { String threadStr = Thread.currentThread().getName(); try { System.out.println(threadStr + "正在静态访问同步方法syn()!!!"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } // 对象的静态同步方法 public static synchronized void syn2() { String threadStr = Thread.currentThread().getName(); try { System.out.println(threadStr + "正在静态访问同步方法syn2()!!!"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } // 对象的静态同步方法 public synchronized void synInstance3() { String threadStr = Thread.currentThread().getName(); try { System.out.println(threadStr + "正在静态访问同步方法synInstance3()!!!"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } // 对象的静态方法2 public static void static2() { String threadStr = Thread.currentThread().getName(); try { System.out.println(threadStr + "正在静态访问方法static2()!!!"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { // 这是多线程要访问的同一个对象 SynStaticMethod sameObj1 = new SynStaticMethod(); SynStaticMethod sameObj2 = new SynStaticMethod(); // 线程1,线程2访问静态同步方法 Thread t1 = new Thread(new T1(sameObj1)); Thread t2 = new Thread(new T2(sameObj2)); t1.start(); t2.start(); } }
/**************************************************************************************** Copyright © 2014 Your Company/Org. All rights reserved.<br> Reproduction or transmission in whole or in part, in any form or<br> by any means, electronic, mechanical or otherwise, is prohibited<br> without the prior written consent of the copyright owner. <br> ****************************************************************************************/ package com.beston.concurrency.synchronization; import java.util.logging.Logger; /** * @ClassName: SynStaticClass * @Description: 不同线程访问类的所有同步块静态方法和静态同步方法时, 线程间是互斥的.其他非静态同步块和同步方法不受影响 * @author beston * @date 2014年3月17日 下午6:02:41 * @version v1.0 * */ public class SynStaticClass { // 线程1 static class T1 implements Runnable { SynStaticClass s; public T1(SynStaticClass sameObj) { this.s = sameObj; } // 线程1访问静态同步方法 public void run() { SynStaticClass.syn(); } } // 线程2 static class T2 implements Runnable { SynStaticClass s; public T2(SynStaticClass sameObj) { this.s = sameObj; } // 线程2访问静态同步方法 public void run() { new SynStaticClass().synInstance4();//不会被阻塞 //new SynStaticClass().syn(); //会阻塞 //new SynStaticClass().syn3(); //会阻塞 //SynStaticClass.syn3(); //阻塞 //SynStaticClass.syn2(); //阻塞 //SynStaticClass.syn(); //阻塞 } } // 对象的同步块静态方法 public static void syn() { synchronized(SynStaticClass.class){ String threadStr = Thread.currentThread().getName(); try { System.out.println(threadStr + "正在静态访问同步方法syn()!!!"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } // 对象的同步块静态方法2 public static void syn2() { synchronized (SynStaticClass.class) { String threadStr = Thread.currentThread().getName(); try { System.out.println(threadStr + "正在静态访问同步方法syn2()!!!"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } } // 对象的静态同步方法3 public static synchronized void syn3() { String threadStr = Thread.currentThread().getName(); try { System.out.println(threadStr + "正在静态访问同步方法syn3()!!!"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } // 对象的同步方法3 public synchronized void synInstance4() { String threadStr = Thread.currentThread().getName(); try { System.out.println(threadStr + "正在访问实例同步方法synInstance4()!!!"); Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) throws InterruptedException { // 这是多线程要访问的同一个类 SynStaticClass sameObj1 = new SynStaticClass(); SynStaticClass sameObj2 = new SynStaticClass(); // 线程1,线程2访问静态同步方法 Thread t1 = new Thread(new T1(sameObj1)); Thread t2 = new Thread(new T2(sameObj2)); t1.start(); Thread.sleep(100); t2.start(); } }