码迷,mamicode.com
首页 > 其他好文 > 详细

JDK1.5——synchronized升级版(显示的Lock操作)

时间:2015-10-25 12:04:38      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

JDK1.5中将Lock接口代替synchronized升级为显示的锁机制,

将Object中的wait、notify、notifyAll替换成了Condition对象中的await、signal、signalAll该对象可以通过Lock进行获取

该示例中实现了本方线程只唤醒对方线程的操作

技术分享
import java.util.concurrent.locks.*;
/*
JDK1.5 中提供了多线程升级解决方案。
将同步Synchronized替换成显示Lock操作。
将Object中的wait,notify notifyAll,替换了Condition对象。
该对象可以Lock锁 进行获取。
该示例中,实现了本方只唤醒对方操作。

Lock:替代了Synchronized
    lock 
    unlock
    newCondition()

Condition:替代了Object wait notify notifyAll
    await();
    signal();
    signalAll();
*/
class LockDemo
{
    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();

//        Thread t11 = new Thread(pro);
//        Thread t22 = new Thread(pro);
//        Thread t33 = new Thread(con);
//        Thread t44 = new Thread(con);

//        t11.start();
//        t22.start();
//        t33.start();
//        t44.start();
    }
}

//资源类
class Resource
{
    private String name;
    private int count = 1;
    private boolean flag = false;
    
    //设置锁对象
    private Lock lock = new ReentrantLock();
    //设置Condition对象,用于对线程进行可控的休眠唤醒操作
    Condition condition_pro = lock.newCondition();//对生产者操作
    Condition condition_con = lock.newCondition();//对消费者操作
    
    //设置资源名称
    public void set(String name)
    {
        lock.lock();
        try
        {
            while (flag)
            {
                condition_pro.await();
            }
            this.name = name+"---"+count++;
            System.out.println(Thread.currentThread().getName()+"..."+name);
            flag = true;
            condition_con.signal();
        }
        catch (Exception e)
        {
        }
        finally
        {
            lock.unlock();//将释放锁的动作放到finally中使其一定会被执行。
        }
    }

    //获取资源(消费资源)
    public void get()
    {
        try
        {
            lock.lock();
            while (!flag)
            {
                condition_con.await();
            }
            System.out.println(Thread.currentThread().getName()+".........."+name);
            flag = false;
            condition_pro.signal();
        }
        catch (Exception e)
        {
        }
        finally
        {
            lock.unlock();
        }
        
    }
}
//生产者类
class producer implements Runnable
{
    private Resource r;
    producer(Resource r)
    {
        this.r = r;
    }

    public void run()
    {
        while (true)
        {
            r.set("+商品+");
        }
    }
}
//消费者类
class consumer implements Runnable
{
    private Resource r;
    consumer(Resource r)
    {
        this.r = r;
    }

    public void run()
    {
        while (true)
        {
            r.get();
        }
    }
}
View Code

 

JDK1.5——synchronized升级版(显示的Lock操作)

标签:

原文地址:http://www.cnblogs.com/gzc911/p/4908354.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!