import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class LockCondition {
static class Conditiona{
static ConcurrentHashMap map = new ConcurrentHashMap<>();
}
//向外提供锁
static class GiveLockUtils{
private ReentrantLock lock;
private String key;
private static ConcurrentHashMap map;
public GiveLockUtils(String key){
synchronized (LockCondition.class) {
if(null == map){
map = new ConcurrentHashMap();
}
if (null == map.get(key)) {
this.lock = new ReentrantLock();
java.util.concurrent.locks.Condition condition = lock.newCondition();
map.put(key,lock);
map.put(key+"condition",condition);
}
}
}
public ConcurrentHashMap<String,Object> getMap(){
return this.map;
}
}
static class Producer{
void producer(){
GiveLockUtils lock = new GiveLockUtils("User");
for (int i = 0; i < 10; i++) {
new Thread(()->{
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
ReentrantLock user = (ReentrantLock) lock.getMap().get("User");
Condition condition = (Condition)lock.getMap().get("Usercondition");
System.out.println(condition.toString());
user.lock();
try {
int value = new Random().nextInt();
Conditiona.map.put(value,value);
condition.signal();
}finally {
user.unlock();
}
}).start();
}
}
}
static class Concumer{
void foo() throws InterruptedException {
Thread thread = new Thread(() -> {
GiveLockUtils user = new GiveLockUtils("UserTwo");
ConcurrentHashMap map = user.getMap();
ReentrantLock lock = (ReentrantLock) map.get("User");
Condition condition = (Condition) map.get("Usercondition");
System.out.println("concumer:"+condition.toString());
lock.lock();
try {
if (user.getMap().size() < 10){
if (null == condition){
System.out.println("conditon为空");
}
condition.await();
System.out.println("没有进行终止");
}
}catch (InterruptedException e) {
e.printStackTrace();
}finally {
lock.unlock();
}
System.out.println(Conditiona.map);
});
thread.start();
thread.join();
}
}
public static void main(String[] args) throws InterruptedException {
Producer producer = new Producer();
Concumer concumer = new Concumer();
producer.producer();
concumer.foo();
}
}