zoukankan      html  css  js  c++  java
  • 4.线程同步-未使用线程同步的生产者/消费者关系

    经典的消费者和生产者的关系

    1.未使用线程同步的生产者消费者的关系

    1)由于线程没有同步,消费者还没访问上一个数据,生产者就将新的数据写入了共享区,这可能导致数据丢失

     表现为:

    生产了8,9.而8丢失了

    2)生产者生产下一个数据之前,消费者又访问了一次数据,这就可能导致数据重复。

    变现为

    代码为:

    package thread;
    
    public class SharedCell {
        public static void main(String args[]) {
            HoldInteger h = new HoldInteger();
            ProduceInteger p = new ProduceInteger(h);
            ConsumeInteger c = new ConsumeInteger(h);
            p.start();
            c.start();
        }
    }
    
    // 生产者进程
    class ProduceInteger extends Thread {
        private HoldInteger pHold;
    
        public ProduceInteger(HoldInteger h) {
            pHold = h;
        }
    
        public void run() {
            for (int count = 0; count < 10; count++) {
                pHold.setSharedInt(count);
                System.out.println("Producer set sharedInt to " + count);
                try {
                    sleep((int) Math.random() * 3000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("Exception " + e.toString());
                }
            }
        }
    }
    
    // 消费者进程
    class ConsumeInteger extends Thread {
        private HoldInteger cHold;
    
        public ConsumeInteger(HoldInteger h) {
            cHold = h;
        }
    
        public void run() {
            int val;
            val = cHold.getSharedInt();
            System.out.println("Consumer retrieved " + val);
            while (val != 9) {
                try {
                    sleep((int) Math.random() * 3000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    System.out.println("Exception " + e.toString());
                }
                val = cHold.getSharedInt();
                System.out.println("Consumer retrived " + val);
            }
        }
    }
    
    // 共享对象
    class HoldInteger {
        private int sharedInt;
    
        public void setSharedInt(int val) {
            sharedInt = val;
        }
    
        public int getSharedInt() {
            return sharedInt;
        }
    }

    结果:

  • 相关阅读:
    Beyond Compare 4 过期操作
    python2 批量转 python3
    【JavaScript】为什么javascript是单线程
    Java之花样玩枚举
    OpenSSL
    OpenSSL和OpenSSH以及私有CA的实现
    Python-线程同步
    Zookeeper基础
    pycharm中使用git以及多分支结构
    BZOJ 4771 主席树+倍增+set
  • 原文地址:https://www.cnblogs.com/caimuqing/p/6133127.html
Copyright © 2011-2022 走看看