线程调用资源类
public class ThreadDemo03 {
public static void main(String [] args){
final ShareData sd = new ShareData();
FutureTask ft = new FutureTask(new Callable(){
@Override
public Object call() throws Exception {
for(int i=1;i<=10;i++){
try {
sd.increment();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
});
new Thread(ft,"aaa").start();
FutureTask ft2 = new FutureTask(new Callable(){
@Override
public Object call() throws Exception {
for(int i=1;i<=10;i++){
try {
sd.decrement();
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
});
new Thread(ft2,"bbb").start();
}
}
方式一:资源类用synchronized同步:
class ShareData{
private int number = 0;
public synchronized void increment() throws InterruptedException {
while(number != 0){ //此处不能用if(number !=0){},线程一多就会出问题
this.wait();
}
++number;
System.out.println(Thread.currentThread().getName()+"---"+number);
this.notifyAll();
}
public synchronized void decrement() throws InterruptedException{
while(number == 0){
this.wait();
}
--number;
System.out.println(Thread.currentThread().getName()+"----"+number);
this.notifyAll();
}
}
方式二:资源类用Lock同步:重点
class ShareData{
private int number = 0;
private Lock lock = new ReentrantLock();
private Condition cod = lock.newCondition();
public void increment(){
lock.lock();
try {
while(number != 0){
cod.await();
}
++number;
System.out.println(Thread.currentThread().getName()+"---"+number);
cod.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}
public void decrement(){
lock.lock();
try {
while(number == 0){
cod.await();
}
--number;
System.out.println(Thread.currentThread().getName()+"---"+number);
cod.signalAll();
} catch (Exception e) {
e.printStackTrace();
}finally{
lock.unlock();
}
}