java线程ReentrantReadWriteLock使用

Lock线程有的效率不高,为了提高效率,可以使用ReentrantReadWriteLock
这个类有2种线程,读线程和写线程。
读线程和读线程不同步,写线程和读线程同步,写线程和写线程同步
如果需要通过可以使用写线程,不需要就使用读线程了
这三种情况我做个例子

读与读


import java.util.concurrent.locks.ReentrantReadWriteLock;

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

public void testMethod1() {
	for(int i=0;i<3;i++) {
		lock.readLock().lock();          //获得读的锁
		System.out.println("线程:"+Thread.currentThread().getName()+"输出"+i);
		lock.readLock().unlock();
	}	
	}
public void testMethod2() {
	for(int i=0;i<3;i++) {
		lock.writeLock().lock();          //获得写的锁
		System.out.println("线程:"+Thread.currentThread().getName()+"输出"+i);
		lock.writeLock().unlock();
	}	
	}
}

public class Mythread extends Thread{
private A a;
public Mythread(A a) {
	super();
	this.a=a;
}
@Override
public void run() {
	a.testMethod1();
}
}
public class Main {

public static void main(String[] args) {
A a=new A();
Mythread tMythread1=new Mythread(a);
Mythread tMythread2=new Mythread(a);
tMythread1.start();
tMythread2.start();
	}

}

java线程ReentrantReadWriteLock使用_第1张图片
多试几次内容会不同

写与写

将 a.testMethod1();修改为 a.testMethod2();

public class Mythread extends Thread{
private A a;
public Mythread(A a) {
	super();
	this.a=a;
}
@Override
public void run() {
	a.testMethod2();
}
}

java线程ReentrantReadWriteLock使用_第2张图片
线程1和0执行顺序不一定,但是必定是一个执行完在执行一个

写与读

新建一个Mythread2,其余和例子2相同

public class Mythread2 extends Thread{
private A a;
public Mythread2(A a) {
	super();
	this.a=a;
}
@Override
public void run() {
	a.testMethod1();
}
}
public class Main {

public static void main(String[] args) {
A a=new A();
Mythread tMythread1=new Mythread(a);
Mythread2 tMythread2=new Mythread2(a);
tMythread1.start();
tMythread2.start();
	}

}
public class Main {

public static void main(String[] args) {
A a=new A();
Mythread tMythread1=new Mythread(a);
Mythread2 tMythread2=new Mythread2(a);
tMythread1.start();
tMythread2.start();
	}

}

java线程ReentrantReadWriteLock使用_第3张图片
还是线程1和0执行顺序不一定,但是必定是一个执行完在执行另一个

你可能感兴趣的:(线程,java)