• JDK1.5——synchronized升级版(显示的Lock操作)


    JDK1.5中将Lock接口代替synchronized升级为显示的锁机制,

    将Object中的wait、notify、notifyAll替换成了Condition对象中的await、signal、signalAll该对象可以通过Lock进行获取

    该示例中实现了本方线程只唤醒对方线程的操作

    import java.util.concurrent.locks.*;
    /*
    JDK1.5 中提供了多线程升级解决方案。
    将同步Synchronized替换成显示Lock操作。
    将Object中的wait,notify notifyAll,替换了Condition对象。
    该对象可以Lock锁 进行获取。
    该示例中,实现了本方只唤醒对方操作。
    
    Lock:替代了Synchronized
        lock 
        unlock
        newCondition()
    
    Condition:替代了Object wait notify notifyAll
        await();
        signal();
        signalAll();
    */
    
    
    //资源类
    class Resource
    {
        private String name;
        private int count = 1;
        private boolean flag = false;
        
        //设置锁对象(通过Lock接口的实现类ReentrantLock)
        private Lock lock = new ReentrantLock();
        //设置Condition对象,用于对线程进行可控的休眠唤醒操作(await、signal、signalAll)
        Condition condition_pro = lock.newCondition();//对生产者操作
        Condition condition_con = lock.newCondition();//对消费者操作
        
        //生产资源
        public void set(String name)
        {
            lock.lock();
            try
            {
                while (flag)
                {
                    condition_pro.await();
                }
                this.name = name+"---"+count++;
                System.out.println(Thread.currentThread().getName()+"..."+name);
                flag = true;
                condition_con.signal();
            }
            catch (Exception e)
            {
            }
            finally
            {
                lock.unlock();//将释放锁的动作放到finally中使其一定会被执行。
            }
        }
    
        //消费资源
        public void get()
        {
            try
            {
                lock.lock();
                while (!flag)
                {
                    condition_con.await();
                }
                System.out.println(Thread.currentThread().getName()+".........."+name);
                flag = false;
                condition_pro.signal();
            }
            catch (Exception e)
            {
            }
            finally
            {
                lock.unlock();
            }
            
        }
    }
    //生产者类
    class producer implements Runnable
    {
        private Resource r;
        producer(Resource r)
        {
            this.r = r;
        }
    
        public void run()
        {
            while (true)
            {
                r.set("+商品+");
            }
        }
    }
    //消费者类
    class consumer implements Runnable
    {
        private Resource r;
        consumer(Resource r)
        {
            this.r = r;
        }
    
        public void run()
        {
            while (true)
            {
                r.get();
            }
        }
    }
    
    class LockDemo
    {
        public static void main(String[] args) 
        {
            //资源类
            Resource r = new Resource();
            //实现了Runnable接口的生产者类、消费者类
            producer pro = new producer(r);
            consumer con = new consumer(r);
            //生产者线程
            Thread t1 = new Thread(pro);
            Thread t2 = new Thread(pro);
            //消费者线程
            Thread t3 = new Thread(con);
            Thread t4 = new Thread(con);
    
            t1.start();
            t2.start();
            t3.start();
            t4.start();
    
    //        Thread t11 = new Thread(pro);
    //        Thread t22 = new Thread(pro);
    //        Thread t33 = new Thread(con);
    //        Thread t44 = new Thread(con);
    
    //        t11.start();
    //        t22.start();
    //        t33.start();
    //        t44.start();
        }
    }
    LockTest
  • 相关阅读:
    CentOS VPS
    Make 命令教程
    Nginx 学习
    字体对齐问题
    postman curl
    linux命令
    服务器
    操作系统
    nginx-1.15遇到无法加载php文件报404的问题
    thinkphp6.0框架下载与安装
  • 原文地址:https://www.cnblogs.com/gzc911/p/4908354.html
Copyright © 2020-2023  润新知