浅谈Java多线程同步机制之同步块(方法)——synchronized

2017-01-08 18:48:15来源:cnblogs.com作者:52Hz人点击

在多线程访问的时候,同一时刻只能有一个线程能够用 synchronized 修饰的方法或者代码块,解决了资源共享。下面代码示意三个窗口购5张火车票:

 1 package com.jikexueyuan.thread; 2 /* 3  * 未使用synchronized,存在并发 4  */ 5 class RunnableDemo implements Runnable{ 6     private int tickets = 5; 7     @Override 8     public void run() { 9         for (int i = 0; i < 10; i++) {10             try {11                 Thread.sleep(500);12             } catch (InterruptedException e) {13                 e.printStackTrace();14             }15                 if (tickets>0) {16                     System.out.println("车票: "+tickets--);17             }18         }19         20     }21 }22 23 public class ThreadTest {24 25     public static void main(String[] args) {26         RunnableDemo r = new RunnableDemo();27         Thread t1 = new Thread(r);28         Thread t2 = new Thread(r);29         Thread t3 = new Thread(r);30         t1.start();31         t2.start();32         t3.start();33     }34 35 }

其中一次的运行结果:

车票: 5车票: 4车票: 3车票: 2车票: 1车票: 2

使用synchronized同步块后:

 1 package com.jikexueyuan.thread; 2 /* 3  * 使用synchronized块 4  */ 5 class RunnableDemo implements Runnable{ 6     private int tickets = 5; 7     @Override 8     public void run() { 9         for (int i = 0; i < 10; i++) {10             try {11                 Thread.sleep(500);12             } catch (InterruptedException e) {13                 e.printStackTrace();14             }15             synchronized (this) {16                 if (tickets>0) {17                     System.out.println("车票: "+tickets--);18                 }19             }20         }21     }22 }23 24 public class ThreadTest {25 26     public static void main(String[] args) {27         RunnableDemo r = new RunnableDemo();28         Thread t1 = new Thread(r);29         Thread t2 = new Thread(r);30         Thread t3 = new Thread(r);31         t1.start();32         t2.start();33         t3.start();34     }35 36 }

使用synchronized同步方法:

 1 package com.jikexueyuan.thread; 2 /* 3  * 使用synchronized同步方法 4  */ 5 class RunnableDemo implements Runnable{ 6     private int tickets = 5; 7     @Override 8     public void run() { 9         for (int i = 0; i < 10; i++) {10             show();11         }12     }13     public synchronized void show() {14         if (tickets>0) {15             System.out.println("车票: "+tickets--);16         }17     }18 }19 20 public class ThreadTest {21 22     public static void main(String[] args) {23         RunnableDemo r = new RunnableDemo();24         Thread t1 = new Thread(r);25         Thread t2 = new Thread(r);26         Thread t3 = new Thread(r);27         t1.start();28         t2.start();29         t3.start();30     }31 32 }

无论使用synchronized同步块还是同步方法,运行结果均为合理结果:

车票: 5车票: 4车票: 3车票: 2车票: 1


思考:volatile是另一种同步机制,是否可以呢?参考我的链接文章:Java理论与实践:正确使用Volatile变量 http://www.ibm.com/developerworks/cn/java/j-jtp06197.html

最新文章

123

最新摄影

微信扫一扫

第七城市微信公众平台