ReentrantLock(某种程度上相当于synchronized,但是扩展了很多功能)
Condition实现等待/通知:
package com.java.mul;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class Run {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Service service = new Service();
MyThreadA a = new MyThreadA(service);
a.setName("A");
a.start();
MyThreadB b = new MyThreadB(service);
b.setName("B");
b.start();
Thread.sleep(3000);
service.signalAll_A();
}
}
package com.java.mul;
public class MyThreadA extends Thread{
private Service service;
public MyThreadA(Service service) {
super();
this.service = service;
}
@Override
public void run() {
service.awaitA();
}
}
package com.java.mul;
public class MyThreadB extends Thread{
private Service service;
public MyThreadB(Service service) {
super();
this.service = service;
}
@Override
public void run() {
service.awaitB();
}
}
package com.java.mul;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
private Lock lock = new ReentrantLock();
public Condition conditionA = lock.newCondition();
public Condition conditionB = lock.newCondition();
public void awaitA() {
try {
lock.lock();
System.out.println("begin awaitA" + System.currentTimeMillis() + " Thread="+Thread.currentThread().getName());
conditionA.await();
System.out.println("end awaitA" + System.currentTimeMillis() + " Thread="+Thread.currentThread().getName());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void awaitB() {
try {
lock.lock();
System.out.println("begin awaitB" + System.currentTimeMillis() + " Thread="+Thread.currentThread().getName());
conditionB.await();
System.out.println("end awaitB" + System.currentTimeMillis() + " Thread="+Thread.currentThread().getName());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
lock.unlock();
}
}
public void signalAll_A() {
try {
lock.lock();
System.out.println(" signalAll_A time " + System.currentTimeMillis()+ " Thread="+Thread.currentThread().getName());
conditionA.signalAll();
}finally {
lock.unlock();
}
}
public void signalAll_B() {
try {
lock.lock();
System.out.println(" signalAll_B time " + System.currentTimeMillis()+ " Thread="+Thread.currentThread().getName());
conditionB.signalAll();
} finally {
lock.unlock();
}
}
}
实现生产者/消费者模式:一对一交替打印
package com.java.mul;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class Run {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Service service = new Service();
MyThreadA a = new MyThreadA(service);
a.setName("A");
a.start();
MyThreadB b = new MyThreadB(service);
b.setName("B");
b.start();
}
}
package com.java.mul;
public class MyThreadA extends Thread{
private Service service;
public MyThreadA(Service service) {
super();
this.service = service;
}
@Override
public void run() {
for(int i=0;i<Integer.MAX_VALUE;i++) {
service.set();
}
}
}
package com.java.mul;
public class MyThreadB extends Thread{
private Service service;
public MyThreadB(Service service) {
super();
this.service = service;
}
@Override
public void run() {
for(int i=0;i<Integer.MAX_VALUE;i++) {
service.get();
}
}
}
package com.java.mul;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
private Lock lock = new ReentrantLock();
public Condition condition = lock.newCondition();
private boolean hasValue = false;
public void set() {
try {
lock.lock();
while(hasValue == true) {
condition.await();
}
System.out.println("print 8");
hasValue = true;
condition.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void get() {
try {
lock.lock();
while(hasValue == false) {
condition.await();
}
System.out.println("print o0o0");
hasValue = false;
condition.signal();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
实现生产者/消费者模式:多对多交替打印
package com.java.mul;
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class Run {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
Service service = new Service();
MyThreadA[] threadA = new MyThreadA[10];
MyThreadB[] threadB = new MyThreadB[10];
for(int i = 0;i<10;i++) {
threadA[i] = new MyThreadA(service);
threadB[i] = new MyThreadB(service);
threadA[i].start();
threadB[i].start();
}
}
}
package com.java.mul;
public class MyThreadA extends Thread{
private Service service;
public MyThreadA(Service service) {
super();
this.service = service;
}
@Override
public void run() {
for(int i=0;i<3;i++) {
service.set();
}
}
}
package com.java.mul;
public class MyThreadB extends Thread{
private Service service;
public MyThreadB(Service service) {
super();
this.service = service;
}
@Override
public void run() {
for(int i=0;i<3;i++) {
service.get();
}
}
}
package com.java.mul;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class Service {
private ReentrantLock lock = new ReentrantLock();
public Condition condition = lock.newCondition();
private boolean hasValue = false;
public void set() {
try {
lock.lock();
while(hasValue == true) {
System.out.println("maybe continuas print 8");
condition.await();
}
System.out.println("print 8");
hasValue = true;
condition.signalAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void get() {
try {
lock.lock();
while(hasValue == false) {
System.out.println("maybe continuas print o0o0");
condition.await();
}
System.out.println("print o0o0");
hasValue = false;
condition.signalAll();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
print 8
maybe continuas print 8
print o0o0
maybe continuas print o0o0
print 8
print o0o0
print 8
maybe continuas print 8
maybe continuas print 8
print o0o0
maybe continuas print o0o0
print 8
maybe continuas print 8
print o0o0
maybe continuas print o0o0
maybe continuas print o0o0
print 8
maybe continuas print 8
maybe continuas print 8
print o0o0
maybe continuas print o0o0
print 8
maybe continuas print 8
print o0o0
print 8
maybe continuas print 8
print o0o0
print 8
maybe continuas print 8
maybe continuas print 8
print o0o0
maybe continuas print o0o0
print 8
maybe continuas print 8
maybe continuas print 8
maybe continuas print 8
print o0o0
print 8
maybe continuas print 8
maybe continuas print 8
maybe continuas print 8
print o0o0
maybe continuas print o0o0
print 8
maybe continuas print 8
maybe continuas print 8
maybe continuas print 8
maybe continuas print 8
print o0o0
maybe continuas print o0o0
print 8
maybe continuas print 8
maybe continuas print 8
maybe continuas print 8
maybe continuas print 8
多对多,输出print 后紧跟的为什么是continus,一直没想明白。
公平锁与非公平锁