重入鎖(ReentrantLock)、重入讀寫鎖(ReentrantReadWriteLock)、線程通信(Condition)

//重入鎖

private Lock lock = new ReentrantLock();  或者private ReentrantLock lock = new ReentrantLock(); 


當使用Lock來保證線程同步時,需使用Condition對象來使線程保持協調。Condition實例被綁定在一個Lock的對象上,使用Lock對象的方法newCondition()獲取Condition的實例。Condition提供了下面三種方法,來協調不同線程的同步:

1、await():導致當前線程等待,直到其他線程調用該Condition的signal()或signalAll()方法喚醒該線程。

2、signal():喚醒在此Lock對象上等待的單個線程。

3、signalAll():喚醒在此Lock對象上等待的所有線程。


-------------------------------------------------------------------1-----------------------------------------------------------------

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


//  重入鎖(ReentrantLock)、重入讀寫鎖(ReentrantReadWriteLock)、線程通信(Condition)


public class Test {
private Lock lock = new ReentrantLock();

public void method1(){
try {
lock.lock();
System.out.println("當前線程:" + Thread.currentThread().getName() + "進入method1..");
Thread.sleep(1000);
System.out.println("當前線程:" + Thread.currentThread().getName() + "退出method1..");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {

lock.unlock();
}
}

public void method2(){
try {
lock.lock();
System.out.println("當前線程:" + Thread.currentThread().getName() + "進入method2..");
Thread.sleep(2000);
System.out.println("當前線程:" + Thread.currentThread().getName() + "退出method2..");
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
} finally {

lock.unlock();
}
}


public static void main(String[] args) {
final Test ur = new Test();
Thread t1 = new Thread(new Runnable() {
public void run() {
ur.method1();
ur.method2();
}
}, "t1");


t1.start();
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
//System.out.println(ur.lock.getQueueLength());


}


}

-------------------------------------------------------------------2-----------------------------------------------------------------

ReentrantLock+Condition實現同步【 等待喚醒】

import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class UseManyCondition {


private ReentrantLock lock = new ReentrantLock();
private Condition c1 = lock.newCondition();
private Condition c2 = lock.newCondition();

public void m1(){
try {
lock.lock();
System.out.println("當前線程:" +Thread.currentThread().getName() + "進入方法m1等待..");
c1.await();
System.out.println("當前線程:" +Thread.currentThread().getName() + "方法m1繼續..");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void m2(){
try {
lock.lock();
System.out.println("當前線程:" +Thread.currentThread().getName() + "進入方法m2等待..");
c1.await();
System.out.println("當前線程:" +Thread.currentThread().getName() + "方法m2繼續..");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void m3(){
try {
lock.lock();
System.out.println("當前線程:" +Thread.currentThread().getName() + "進入方法m3等待..");
c2.await();
System.out.println("當前線程:" +Thread.currentThread().getName() + "方法m3繼續..");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void m4(){
try {
lock.lock();
System.out.println("當前線程:" +Thread.currentThread().getName() + "喚醒..");
c1.signalAll();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void m5(){
try {
lock.lock();
System.out.println("當前線程:" +Thread.currentThread().getName() + "喚醒..");
c2.signal();
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public static void main(String[] args) {


final UseManyCondition umc = new UseManyCondition();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
umc.m1();
}
},"t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
umc.m2();
}
},"t2");
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
umc.m3();
}
},"t3");
Thread t4 = new Thread(new Runnable() {
@Override
public void run() {
umc.m4();
}
},"t4");
Thread t5 = new Thread(new Runnable() {
@Override
public void run() {
umc.m5();
}
},"t5");

t1.start(); // c1
t2.start(); // c1
t3.start(); // c2



try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}


t4.start(); // c1
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
t5.start(); // c2

}



}


-------------------------------------------------------------------3-----------------------------------------------------------------

public class UseCondition {


private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();

public void method1(){
try {
lock.lock();
System.out.println("當前線程:" + Thread.currentThread().getName() + "進入等待狀態..");
Thread.sleep(3000);
System.out.println("當前線程:" + Thread.currentThread().getName() + "釋放鎖..");
condition.await(); // Object wait
System.out.println("當前線程:" + Thread.currentThread().getName() +"繼續執行...");
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public void method2(){
try {
lock.lock();
System.out.println("當前線程:" + Thread.currentThread().getName() + "進入..");
Thread.sleep(3000);
System.out.println("當前線程:" + Thread.currentThread().getName() + "發出喚醒..");
condition.signal(); //Object notify
} catch (Exception e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}

public static void main(String[] args) {

final UseCondition uc = new UseCondition();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
uc.method1();
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
uc.method2();
}
}, "t2");
t1.start();


t2.start();
}



}

-------------------------------------------------------------------4---------------------------------------------------

重入讀寫鎖(ReentrantReadWriteLock)

import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.WriteLock;


public class UseReentrantReadWriteLock {


private ReentrantReadWriteLock rwLock = new ReentrantReadWriteLock();
private ReadLock readLock = rwLock.readLock();
private WriteLock writeLock = rwLock.writeLock();

public void read(){
try {
readLock.lock();
System.out.println("當前線程:" + Thread.currentThread().getName() + "進入...");
Thread.sleep(3000);
System.out.println("當前線程:" + Thread.currentThread().getName() + "退出...");
} catch (Exception e) {
e.printStackTrace();
} finally {
readLock.unlock();
}
}

public void write(){
try {
writeLock.lock();
System.out.println("當前線程:" + Thread.currentThread().getName() + "進入...");
Thread.sleep(3000);
System.out.println("當前線程:" + Thread.currentThread().getName() + "退出...");
} catch (Exception e) {
e.printStackTrace();
} finally {
writeLock.unlock();
}
}

public static void main(String[] args) {

final UseReentrantReadWriteLock urrw = new UseReentrantReadWriteLock();

Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
urrw.read();
}
}, "t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
urrw.read();
}
}, "t2");
Thread t3 = new Thread(new Runnable() {
@Override
public void run() {
urrw.write();
}
}, "t3");
Thread t4 = new Thread(new Runnable() {
@Override
public void run() {
urrw.write();
}
}, "t4");

// t1.start();
// t2.start();

// t1.start(); // R 
// t3.start(); // W

t3.start();
t4.start();








}
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章