day11多线程的安全问题-同步(技术锁)-多个生产者和消费者

对线程安全问题提供解决方法

就是同步代码块(技术锁)

Synchronized(对象)

{

需要同步的代码

同步的前提

1、必须要有两个或者两个以上的线程

2、必须多个线程使用同一个锁


程序是否有安全问题

找问题

1、明确那些代码是多线程运行的代码

2、明确共享数据

3、明确多线程运行代码中有那些语句是操作共享数据的。

import java.until.concurrent.locks.*;


class  ProducerConsumerDemo1
{
public static void main(String[] args) 
{
Resource r=new Resource();


Producer pro=new Producer(r);
Consumer con=new Consumer(r);


Thread t1=new Thread(pro);
Thread t2=new Thread(con);


t1.start();
t2.start();
}
}

/*

JDK1.5提供了多线程升级解决方案

将同步Synchronized替换成现实Lock操作

将object中的 wait() notify() notifyAll()替换成Condition对象

lock------unlock

condition.await()

condition.signal()

一个lock对应多个condition对象



*/
class Resource
{
private String name;
private int count=1;
private boolean flag=false;


private Lock lock=new ReentrantLock();


private Condition condition_pro=lock.newCondition();
private Condition condition_con=lock.newCondition();


public  void set(String name) throws InterruptedException
{
lock.lock();
try
{
while (flag) // if------while
condition_pro.await(); //    t1(放弃资格)    t2(放弃资格)
this.name=name+"--"+count++;


System.out.println(Thread.currentThread().getName()+"..生产者.."+this.name);
flag=true;
condition_con.signal();

}
finally
{
lock.unlock();
} // notify------notifyAll

}
public  void out() throws InterruptedException
{
lock.lock();
try
{
while (!flag)
condition_con.await(); // t3(放弃资格)    t4(放弃资格)
System.out.println(Thread.currentThread().getName()+"..消费者.."+this.name);
flag=false;
condition_pro.signal();
}
finally
{
lock.unlock();
}

}
}

class Producer implements Runnable
{
private Resource res;


Producer(Resource res)
{
this.res=res;
}
public void run()
{
while(true)
{
try
{
res.set("+商品+");
}
catch (InterruptedException e)
{
}

}
}
}

class Consumer implements Runnable
{
private Resource res;


Consumer(Resource res)
{
this.res=res;
}
public void run()
{
while(true)
{
try
{
res.out();
}
catch (InterruptedException e)
{
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值