package cn.everest.thread;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class OperateThreadShareDate2 {
public static void main(String[] args) {
Resource resource = new Resource();
IncreData increData = new IncreData(resource);
DecreData decreData = new DecreData(resource);
for (int i = 0; i < 2; i++) {
new Thread(increData).start();
new Thread(decreData).start();
}
}
}
class IncreData implements Runnable {
private Resource resource;
public IncreData(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
resource.increment();
}
}
}
class DecreData implements Runnable {
private Resource resource;
public DecreData(Resource resource) {
this.resource = resource;
}
@Override
public void run() {
for (int i = 0; i < 1000; i++) {
resource.decrement();
}
}
}
class Resource {
private int x = 0;
private boolean flag = false;
public Resource() {
}
final Lock lock = new ReentrantLock();
Condition increCondition = lock.newCondition();
Condition decreCondition = lock.newCondition();
public void increment() {
lock.lock();
try {
while (flag) {
increCondition.await();
}
x = x + 1;
System.out.println("x +++++++++++++++++++++++: " + x);
flag = !flag;
decreCondition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} // end increment
public void decrement() {
lock.lock();
try {
while (!flag) {
decreCondition.await();
}
x = x - 1;
System.out.println("x ------------: " + x);
flag = !flag;
increCondition.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
} // end decrement
} // end Resource