zoukankan      html  css  js  c++  java
  • 015.1 Lock接口

    内容:Lock接口使用步骤,同步生产大白兔奶糖的例子

    同步代码块的锁是隐式的,显式容易让我们理解。所以我们使用这个显式的方法,方便理解代码。
    ######实现同步步骤:
    1、获取锁:lock()
    2、同步代码
    3、释放锁:unlock()
    但是同步代码可能出现异常,所以需要使用try{}finally{}

    例子代码:

    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    
    public class NewProducerConsumer
    {
    
        public static void main(String[] args)
        {
            Res r = new Res();
            Producer producer = new Producer(r);
            Consumer consumer = new Consumer(r);
            Thread t0 = new Thread(producer);
            Thread t1 = new Thread(producer);
            Thread t2 = new Thread(consumer);
            Thread t3 = new Thread(consumer);
            t0.start();
            t1.start();
            t2.start();
            t3.start();
        }
    }
    
    class Res{
        private String name;
        private int count;
        private boolean flag = false;
        Lock lock = new ReentrantLock();   //产生一个锁
        public void set(String name)                   //Res的set方法和get方法是用的是同一个锁,所以同一个对象两个方法只会执行一个方法
        {
            lock.lock();   //获取锁
            try{
                while(flag){
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                this.name = name + "--" + count;
                count++;
                System.out.println(Thread.currentThread().getName()+"____生产者______"+this.name);
                flag = true;
                notifyAll();
            }
            finally{
                lock.unlock();    //释放锁
            }
        }
        public void get()
        {
            lock.lock();
            try{
                while(!flag){
                    try {
                        wait();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
                System.out.println(Thread.currentThread().getName()+"....消费者。。。。"+this.name);
                flag = false;
                notifyAll();
            }
            finally{
                lock.unlock();
            }
        }
    }
    
    class Producer implements Runnable{
        private Res r;
        public Producer(Res r) {
            this.r = r;
        }
        public void run()
        {
            int i = 0;
            while(i<100){
                r.set("大白兔奶糖");
                i++;
            }
        }
    }
    
    
    class Consumer implements Runnable{
        private Res r;
        public Consumer(Res r) {
            this.r = r;
        }
        public void run()
        {
            int i = 0;
            while(i<100){
                r.get();
                i++;
            }
        }
    }

    如果看不懂例子,欢迎提问

  • 相关阅读:
    mount 和 umount 命令
    mmap函数使用
    Linux系统下查看目录大小
    守护进程的创建方法和步骤
    linux中的dup()系统调用
    uboot烧写命令--yaffs、jiffs和ubifs
    对volatile关键字的理解
    linux下如何挂接(mount)光盘镜像文件、移动硬盘、U盘、Windows网络共享和NFS网络共享
    常用NFS mount选项介绍
    mount nfs 经常出错信息总结(转)
  • 原文地址:https://www.cnblogs.com/-nbloser/p/8621799.html
Copyright © 2011-2022 走看看