Java并发编程实例(synchronized)

王朝学院·作者佚名  2016-05-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

java并发编程实例(synchronized)此处用一个小程序来说明一下,逻辑是一个计数器(int i);主要的逻辑功能是,如果同步监视了资源i,则不输出i的值,但如果没有添加关键字synchronized,因为是两个线程并发执行,所以会输出i的值,类实现Runnable接口。

下面是run()方法,利用i一次加二,若是奇数则输出,若输出(则为并发编程,共享资源没有被监视),若没有输出(则共享资源被监视,一次只允许一个线程使用),Runnable接口的Run方法如下所示:

public void run(){ while(true){ if(this.getValue()%2!=0){ System.out.PRintln(this.getValue()); } if(Thread.currentThread().getName().equals("b")){ this.next(); } try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }

在分别写一个得到i值的方法,和增加i值的方法,若是同步监视的并发线程要加synchronized,若不是可不加,自行比较结果:

public synchronized void next(){ //此处的synchronized,定义了此处代码块,只允许一个线程访问 i+=2;//i一次性加二 } public synchronized int getValue(){ return i; }//得到i的值,进行输出判断

在类中创建一个主方法,构造一个对象,实例化两个线程,补充一点,synchronized关键字修饰的代码块,只允许同一个对象的不同线程至多一次访问,而如果构造了两个对象那么synchronized修饰的代码块,依然会被同时访问,容易造成数据混乱,死锁的现象。

代码如下:

public static void main(String[] args){ SecondThread st = new SecondThread(); Thread st1 = new Thread(st,"a"); Thread st2 = new Thread(st,"b"); st1.start(); st2.start(); try { st1.join(); st1.join(); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } }

输出为(无输出,且线程不销毁):

若是去除掉synchronized,能输出奇数。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航