Lock 인터페이스의 세 가지 구현 클래스

3355 단어 java 병발
하나.ReentrantLock(잠금 재입력 가능)
자물쇠를 다시 들어갈 수 있습니다.자세히 보기:https://mp.csdn.net/mdeditor/100807462#
예:
class Clerk {
    private int product = 0;// 
    private Lock lock = new ReentrantLock();// 
    private Condition condition = lock.newCondition();// condition 
    public  void get() { // 
        lock.lock();// 
        try {
            while (product >= 1) {
                System.out.println(" ");
                try {
                    condition.await();// 
                } catch (InterruptedException e) {
                }
            }
            System.out.println(Thread.currentThread().getName() + ":" + (++product));
            condition.signalAll();// 
        }finally {
            lock.unlock();// 
        }
    }

    public  void sell() {// 
        lock.lock();// 
        try {
            while (product <= 0) {
                System.out.println(" ");
                try {
                    condition.await();// 
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println(Thread.currentThread().getName() + ":" + (--product));
            condition.signalAll();// 
        }finally {
            lock.unlock();// 
        }
    }
}

둘.ReentrantReadWriteLock 클래스의 정적 내부 클래스 ReadLock(읽기-쓰기 잠금)
읽기 - 쓰기 잠금은 상호 배척 잠금보다 공유 데이터에 대해 더 높은 수준의 병렬 접근을 허용합니다.한 번에 하나의 선 (writer 루틴) 만 공유 데이터를 수정할 수 있지만, 많은 경우, 공유 데이터 (reader 루틴) 를 동시에 읽을 수 있다.이론적으로 말하자면 서로 밀어붙이는 잠금에 비해 읽기-쓰기 잠금이 허용하는 병발성 강화는 더욱 큰 성능 향상을 가져올 것이다.쓰기/읽기/쓰기는 서로 배척해야 하고, 읽기/쓰기는 서로 배척할 필요가 없다.
셋.Reentrant ReadWriteLock 클래스의 정적 내부 클래스 WriteLock(읽기-쓰기 잠금)
읽기 - 쓰기 잠금은 상호 배척 잠금보다 공유 데이터에 대해 더 높은 수준의 병렬 접근을 허용합니다.한 번에 하나의 선 (writer 루틴) 만 공유 데이터를 수정할 수 있지만, 많은 경우, 공유 데이터 (reader 루틴) 를 동시에 읽을 수 있다.이론적으로 말하자면 서로 밀어붙이는 잠금에 비해 읽기-쓰기 잠금이 허용하는 병발성 강화는 더욱 큰 성능 향상을 가져올 것이다.쓰기/읽기/쓰기는 서로 배척해야 하고, 읽기/쓰기는 서로 배척할 필요가 없다.
예:
public class TestReadWriterLock {
    public static void main(String[] args){
           ReadWriterLockDemo rw = new ReadWriterLockDemo();
           new Thread(new Runnable() {// 
               @Override
               public void run() {
                   rw.set((int)Math.random()*101);
               }
           },"write:").start();
           for (int i = 0;i<100;i++){//100 
               Runnable runnable = () -> rw.get();
               Thread thread = new Thread(runnable);
               thread.start();
           }
    }
}

class ReadWriterLockDemo{
    private int number = 0;
    private ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    // ( )
    public void get(){
        readWriteLock.readLock().lock();// 
        try {
            System.out.println(Thread.currentThread().getName()+":"+number);
        }finally {
            readWriteLock.readLock().unlock();// 
        }
    }
    // ( )
    public void set(int number){
        readWriteLock.writeLock().lock();
        try {
            System.out.println(Thread.currentThread().getName());
            this.number = number;
        }finally {
            readWriteLock.writeLock().unlock();
        }
    }
}

참조:https://blog.csdn.net/m0_38110132/article/details/74571805            https://www.jianshu.com/p/1f19835e05c0

좋은 웹페이지 즐겨찾기