java_线程(Lock锁使用)

JDK5以后提供了一个新的锁对象Lock,它能够更加清晰的表达如何加锁和释放锁

  • Lock实现提供比使用synchronized方法和语句可以获得的更广泛的锁定操作。
    它们允许更灵活的结构化,可能具有完全不同的属性,并且可以支持多个相关联的对象Condition
void lock():获得锁
void unlock():释放锁
  • Lock是接口不能直接实例化,这里采用它的实现类ReentrantLock来实例化
    • ReentrantLock的构造方法:ReentrantLock()创建一个ReentrantLock的实列
package com.client.aaaaaaaaaaaaaaaa;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
 * @author LunarYouI
 * @create 2022-07-26 16:29
 */
public class ThreadDemo {
    
    
    public static void main(String[] args) throws InterruptedException {
    
    
        Demo demo = new Demo();
        Thread 窗口1 = new Thread(demo, "窗口1");
        Thread 窗口2 = new Thread(demo, "窗口2");

        窗口1.start();
        窗口2.start();

    }
}

class Demo implements Runnable{
    
    
    private int num = 100;
    private Lock lock = new ReentrantLock();

    @Override
    public void run() {
    
    
        while(true){
    
    
            lock.lock();
            try {
    
    
                if(num>0){
    
    
                    Thread.sleep(100);
                    System.out.println(Thread.currentThread().getName()+"正在出售第"+num+"票");
                    num--;
                }
            } catch (InterruptedException e) {
    
    
                e.printStackTrace();
            } finally {
    
    
                lock.unlock();
            }
        }
    }
}

注意:lock.lock()后面需要紧跟着try随后在finally中释放lock.unlock()
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_46100517/article/details/126037747