zoukankan      html  css  js  c++  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,能输出奇数。

  • 相关阅读:
    react-webpack
    react
    重置手机过程
    运用 Node-RED 开发 LoRa 应用
    IBM Node-RED 安装与使用教程
    Node-RED 入门教程:简介
    Thingsboard 3.0 修改 Title、默认语言、主题颜色
    Thingsboard 3.0 通过 tb-gateway 网关接入 MQTT 设备教程
    Thingsboard 入门学习笔记:属性
    ThingsBoard 3.0 版本发布
  • 原文地址:https://www.cnblogs.com/xiangxi/p/4694379.html
Copyright © 2011-2022 走看看