java 线程 资源_Java多线程操作同一份资源

该博客演示了使用Java的ReentrantLock和Condition对象实现线程间的同步,通过`increment`和`decrement`方法确保在多线程环境下对共享资源的安全操作。代码中展示了在高并发场景下,如何避免虚假唤醒并遵循‘判断/干活/通知’的编程套路。
摘要由CSDN通过智能技术生成

packagecom.yangyuanyuan.juc1205;importjava.util.concurrent.locks.Condition;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;classAircondition

{private int number = 0;private Lock lock = newReentrantLock();private Condition condition =lock.newCondition();public void increment()throwsException

{

lock.lock();try{//1 判断

while (number != 0)

{

condition.await();//this.wait();

}//2 干活

number++;

System.out.println(Thread.currentThread().getName()+"\t"+number);//3 通知

condition.signalAll();//this.notifyAll();

}catch(Exception e){

e.printStackTrace();

}finally{

lock.unlock();

}

}public void decrement()throwsException

{

lock.lock();try{//1 判断

while (number == 0)

{

condition.await();//this.wait();

}//2 干活

number--;

System.out.println(Thread.currentThread().getName()+"\t"+number);//3 通知

condition.signalAll();//this.notifyAll();

}catch(Exception e){

e.printStackTrace();

}finally{

lock.unlock();

}

}/*public synchronized void increment()throws Exception

{

//1 判断

while (number != 0)

{

//AAA CCC

this.wait();

}

//2 干活

number++;

System.out.println(Thread.currentThread().getName()+"\t"+number);

//3 通知

this.notifyAll();

}

public synchronized void decrement()throws Exception

{

//1 判断

while(number == 0)

{

this.wait();

}

//2 干活

number--;

System.out.println(Thread.currentThread().getName()+"\t"+number);

//3 通知

this.notifyAll();

}*/}/**1 高聚低合前提下,线程操作资源类

2 判断/干活/通知

3 防止虚假唤醒 不能使用if判断,会出现2

知识小总结 = 多线程编程套路+while判断+新版写法*/

public classProdConsumerDemo04

{public static void main(String[] args)throwsException

{

Aircondition aircondition= newAircondition();new Thread(() ->{for (int i = 1; i <=10; i++)

{try{

Thread.sleep(200);

aircondition.increment();

}catch(Exception e) {

e.printStackTrace();

}

}

},"A").start();new Thread(() ->{for (int i = 1; i <=10; i++)

{try{

Thread.sleep(300);

aircondition.decrement();

}catch(Exception e) {

e.printStackTrace();

}

}

},"B").start();new Thread(() ->{for (int i = 1; i <=10; i++)

{try{

Thread.sleep(400);

aircondition.increment();

}catch(Exception e) {

e.printStackTrace();

}

}

},"C").start();new Thread(() ->{for (int i = 1; i <=10; i++)

{try{

Thread.sleep(500);

aircondition.decrement();

}catch(Exception e) {

e.printStackTrace();

}

}

},"D").start();

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值