星空网 > 软件开发 > Java

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,能输出奇数。




原标题:Java并发编程实例(synchronized)

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流