JDK1.5提供了多线程升级解决方案
将同步Sunchronized替换成Lock操作。
将Object中的wait,notify notifyAll ,替换了Condition对象.
该对象可以Lock锁进行获取。
懒汉式:
将同步Sunchronized替换成Lock操作。
将Object中的wait,notify notifyAll ,替换了Condition对象.
该对象可以Lock锁进行获取。
在实例中,实现了本方只唤醒对方操作
import java.util.concurrent.locks.*;
class Consumer implements Runnable
{
private Resource r;
Consumer(Resource r)
{
this.r = r;
}
public void run()
{
while(true)
{
try{
r.out();
}
catch(InterruptedException e)
{}
}
}
}
class Producer implements Runnable
{
private Resource r;
Producer(Resource r)
{
this.r = r;
}
public void run()
{
int x = 0;
while(true)
{
try{
r.set("商品");
}
catch(InterruptedException e)
{}
}
}
}
class Resource
{
private String name;
private boolean flag=false;
private int count=1;
private Lock lock=new ReentrantLock();
private Condition condition_con = lock.newCondition();
private Condition condition_pro = lock.newCondition();
public void set(String name)throws InterruptedException
{
lock.lock();//获取锁
try{
while(flag)
condition_pro.await();
this.name = name+"--"+count++;
System.out.println(Thread.currentThread().getName()+"...生产..."+this.name);
flag=true;
condition_con.signal();//释放锁
}
finally{
lock.unlock();
}
}
public void out()throws InterruptedException
{
lock.lock();
try{
while(!flag)
condition_con.await();
System.out.println(Thread.currentThread().getName()+"...消费........"+this.name);
flag = false;
condition_pro.signal(); //唤醒一个线程
}
finally{
lock.unlock(); //释放锁的动作一定要执行
}
}
}
class InputOutputDemo3
{
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(pro);
Thread t3 = new Thread(con);
Thread t4 = new Thread(con);
t1.start();
t2.start();
t3.start();
t4.start();
}
}
单列设计模式---当类只需让用户创建一个对象,自己创建对象返回给用户。
饿汉式
class Single
{
private static final Single s = new Single();
private Single(){}
public static Single getInstance()
{
return s;
}
} //推荐使用
懒汉式:
class Single
{
private static Single s = null;
private Single(){}
public static Single getInstance()
{
if(s==null)
{
synchronized(Single.class)
{
if(s==null)
s = new Single();
}
}
return s;
}
}