JAVA—Lock接口实现类ReentrantLock的五种锁,读写锁,volatile关键字
Lock接口实现类ReentrantLock的五种锁
Lock l = new ReentrantLock ( ) ;
l. lock ( ) ;
l. tryLock ( ) ;
try {
l. tryLock ( 10 , TimeUnit. SECONDS) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
try {
l. lockInterruptibly ( ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
l. unlock ( ) ;
读写锁:
读锁:多个线程一起读
写锁:排他锁,一个线程得到了写锁后,其他线程不可以写,只有一个线程能够写
import java. util. concurrent. locks. ReadWriteLock;
import java. util. concurrent. locks. ReentrantReadWriteLock;
public class Test {
public static void main ( String[ ] args) {
final Operator operator = new Operator ( ) ;
for ( int i = 0 ; i < 5 ; i++ ) {
new Thread ( "读线程" + i) {
@Override
public void run ( ) {
while ( true ) {
operator. read ( ) ;
}
}
} . start ( ) ;
}
for ( int i = 0 ; i < 5 ; i++ ) {
new Thread ( "写线程" + i) {
@Override
public void run ( ) {
while ( true ) {
operator. write ( ) ;
}
}
} . start ( ) ;
}
}
static class Operator {
private ReadWriteLock rwl = new ReentrantReadWriteLock ( ) ;
public void read ( ) {
rwl. readLock ( ) . lock ( ) ;
try {
System. out. println ( Thread. currentThread ( ) . getName ( ) + "开始读取数据" ) ;
try {
Thread. sleep ( 10 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
System. out. println ( Thread. currentThread ( ) . getName ( ) + "读取数据完毕" ) ;
} finally {
rwl. readLock ( ) . unlock ( ) ;
}
}
public void write ( ) {
rwl. writeLock ( ) . lock ( ) ;
try {
System. out. println ( Thread. currentThread ( ) . getName ( ) + "开始写数据" ) ;
try {
Thread. sleep ( 10 ) ;
} catch ( InterruptedException e) {
e. printStackTrace ( ) ;
}
System. out. println ( Thread. currentThread ( ) . getName ( ) + "写数据完毕" ) ;
} finally {
rwl. writeLock ( ) . unlock ( ) ;
}
}
}
}
volatile关键字:一个线程修改的状态 对另一个线程是可见的(synchronized,final也可以)
private static volatile boolean flag = true ;
public static void main ( String[ ] args) throws InterruptedException {
new Thread ( new Runnable ( ) {
@Override
public void run ( ) {
while ( flag) {
}
}
} ) . start ( ) ;
Thread. sleep ( 1000 ) ;
flag = false ;
}