欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Lock多线程

程序员文章站 2024-01-08 08:30:04
...
/*
在java.util.concurrent.locks 软件包中提供相应的解决方案
Lock接口,比同步更厉害,有更多操作:
            lock();获取锁
            unlock();释放锁
      提供一个更加面向对象的锁,在该锁中提供了更多的显式的锁操作.

 已经将旧锁换成新锁,那么锁上的监视器方法(wait,notify,notifyAll)也应该替换成新锁的监视器方法.
 原有的监视器方法封装到了一个Condition对象中.
 想要获取监视器方法,需要先获取Condition对象.

 Condition对象的出现其实就是替代了Object中的监视器方法。
 await();
 signal();
 signalAll();


{
     Lock lock = new ReentrantLock();

     所有的监视器方法封装到Condition对象中.
     Condition con = lock.newCondition();//获取lock上的监视器方法

     lock.lock();//获取锁
        con.await();//wait()
        con.signal();//notify();
     lock.unlock();//释放锁
}




可以在一个锁上加多个监视器对象,解决效率问题
 */


import java.util.concurrent.locks.*;

//1.描述资源。属性:名称和编号。行为:对名称赋值,获取
class Resource{
    private String name;
    private int count = 1;

    //定义一个锁对象.
    private Lock lock = new ReentrantLock();
    //获取锁上的Condition对象;为了解决本方唤醒对方的问题,可以一个锁上创建两个监视器对象.
    private Condition produce = lock.newCondition();//生产者监视器对象
    private Condition consume = lock.newCondition();//消费者监视器对象

    //定义标记
    private boolean flag = false;

    //1.提供设置的方法。
    public void set(String name)  {
        //获取锁
        lock.lock();
        try {

            /*if*/
            while (flag)   //多生产多消费,if改为while判断标记
                try {
                    produce.await();
                } catch (InterruptedException e) {
                }
            this.name = name + count;
            count++;

            //打印生产了哪个商品
            System.out.println(Thread.currentThread().getName() + "---生产者---" + this.name);

            //将标记改为true
            flag = true;
            //唤醒消费者。
            consume.signal();
        }finally {
            lock.unlock();
        }
    }

    public void out() {
        lock.lock();
        try {
            /*if*/
            while (!flag)
                try {
                    consume.await();
                } catch (InterruptedException e) {
                }

            System.out.println(Thread.currentThread().getName() + "---消费者---" + this.name);
            //将标记改为false
            flag = false;
            //唤醒生产者
            produce.signalAll();
        }finally {
            lock.unlock();
        }
    }
}

//2.描述生产者
class Producer implements Runnable{
    private Resource r;
    //生产者一初始化就要有资源,需要将资源传递到构造函数中。
    Producer(Resource r){
        this.r = r;
    }

    @Override
    public void run() {
        while (true){
            r.set("面包");
        }

    }
}

//3.描述消费者
class Consumer implements Runnable{
    private Resource r;
    //消费者一初始化就要有资源,需要将资源传递到构造函数中。
    Consumer(Resource r){
        this.r = r;
    }

    @Override
    public void run() {
        while (true){
            r.out();
        }
    }
}


public class ThreadDemo {
    public static void main(String[] args) {
        //1.创建资源对象
        Resource r = new Resource();

        //2.创建线程任务
        Producer pro = new Producer(r);
        Consumer con = new Consumer(r);

        //3.创建线程
        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();
    }

}

上一篇:

下一篇: