package com.zf.lock;
import java.lang.reflect.Method;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class JDKLockTest {
private ReadWriteLock rw = new ReentrantReadWriteLock();
public void read(){
try{
rw.readLock().lock(); //
System.out.println(Thread.currentThread().getName() + " 正在读");
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}finally{
rw.readLock().unlock();
System.out.println(Thread.currentThread().getName() + " 正在读完");
}
}
public void write(){
try{
rw.writeLock().lock(); //
System.out.println(Thread.currentThread().getName() + " 正在写");
Thread.sleep(3000);
}catch(Exception e){
e.printStackTrace();
}finally{
rw.writeLock().unlock();
System.out.println(Thread.currentThread().getName() + " 正在写完");
}
}
public static void main(String[] args) throws Exception{
JDKLockTest jdk = new JDKLockTest();
new Thread(new JDKLockThread(jdk , "read")).start();
new Thread(new JDKLockThread(jdk , "read")).start();
new Thread(new JDKLockThread(jdk , "read")).start();
new Thread(new JDKLockThread(jdk , "read")).start();
new Thread(new JDKLockThread(jdk , "read")).start();
new Thread(new JDKLockThread(jdk , "write")).start();
new Thread(new JDKLockThread(jdk , "write")).start();
new Thread(new JDKLockThread(jdk , "write")).start();
new Thread(new JDKLockThread(jdk , "write")).start();
new Thread(new JDKLockThread(jdk , "write")).start();
}
}
class JDKLockThread implements Runnable{
private JDKLockTest lockTest ;
private String methodName ;
private Method method ;
public JDKLockThread( JDKLockTest lockTest , String methodName ) throws Exception{
this.lockTest = lockTest ;
this.methodName = methodName ;
this.method = JDKLockTest.class.getMethod(methodName);
}
@Override
public void run() {
while(true){
try {
while(true)
method.invoke(lockTest);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
//可重入锁
private static final Lock lock = new ReentrantLock() ;