스레드:ReentrantReadWriteLock 클래스

3108 단어
ReentrantReadWriteLock 。
 , , ;
 , 。
 , , 。

한 라인은 대상 A의 쓰기 자물쇠를 가지고 있으며, 쓰기 자물쇠를 풀기 전에 다른 라인은 A의 읽기 자물쇠, 쓰기 자물쇠를 얻을 수 없기 때문에 다른 라인은 이때 읽기 및 쓰기를 할 수 없습니다.한 라인은 대상 A의 읽기 자물쇠를 가지고 있으며, 풀기 전에 다른 라인은 A의 읽기 자물쇠를 얻을 수 있지만 A의 쓰기 자물쇠를 얻을 수 없기 때문에 다른 라인은 읽을 수 있고 쓸 수 없습니다.읽기 자물쇠를 채우지 않으면 다른 라인은 읽을 수 있지만 쓸 수도 있다. 이때 데이터가 일치하지 않을 수도 있다
 

읽기 자물쇠 공유


lock을 사용합니다.readLock () 읽기 자물쇠는 프로그램 실행 효율을 높일 수 있으며, 여러 개의 루트가lock () 방법 뒤에 있는 코드를 동시에 실행할 수 있습니다
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Service {
    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();

    public void read(){
        try {
            lock.readLock().lock();
            System.out.println(" "+Thread.currentThread().getName()+" "+System.currentTimeMillis());

            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.readLock().unlock();
        }

    }
}

public class ThreadA extends Thread{
    private Service service = new Service();

    public ThreadA(Service service){
        super();
        this.service = service;
    }


    @Override
    public void run(){
        service.read();
    }
}


public class ThreadB extends Thread{
    private Service service = new Service();

    public ThreadB(Service service){
        super();
        this.service = service;
    }


    @Override
    public void run(){
        service.read();
    }
}


public class Run {
    public static void main(String[] args) {
        Service service = new Service();
        ThreadA a = new ThreadA(service);
        ThreadB b = new ThreadB(service);
        a.setName("A");
        b.setName("B");
        a.start();
        b.start();
    }
}

 

쓰기 자물쇠가 서로 밀어냄


자물쇠 코드를 사용합니다. lock.writeLock () 의 효과는 같은 시간에 한 라인만 lock () 방법 뒤에 있는 코드를 실행할 수 있도록 하는 것입니다
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class Service {
	private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
	
	public void writeLock(){
		try {
			lock.writeLock().lock();
			System.out.println(" :"+Thread.currentThread().getName()+"  :"+System.currentTimeMillis());
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}finally{
			lock.writeLock().unlock();
		}
	}
}

public class ThreadA extends Thread{
	private Service service;
	
	public ThreadA(Service service){
		super();
		this.service = service;
	}
	
	@Override
	public void run(){
		service.writeLock();
	}
}

public class ThreadB extends Thread{
	private Service service;
	
	public ThreadB(Service service){
		super();
		this.service = service;
	}
	
	@Override
	public void run(){
		service.writeLock();
	}
}

public class Run {
	public static void main(String[] args){
		Service s = new Service();
		ThreadA a = new ThreadA(s);
		ThreadB b = new ThreadB(s);
		
		a.setName("A");
		b.setName("B");
		a.start();
		b.start();
	}
}



좋은 웹페이지 즐겨찾기