黑马程序员技术交流社区

标题: lock与sychronized区别 [打印本页]

作者: yangshang1    时间: 2012-3-26 17:52
标题: lock与sychronized区别
lock与sychronized区别?
作者: 李柯    时间: 2012-3-26 18:00
lock是cynchronized 的升级,Lock能完成synchronized的所有功能
但在释放锁时后者会自动释放,前者需要在finally中手动释放

作者: yangshang1    时间: 2012-3-26 19:35
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;


public class TestLock2 {
   public static void main(String[] args) {
           ReSource rs=new ReSource();
           Produce p=new Produce(rs);
           Custom c=new Custom(rs);
           Thread t=new Thread(p);
           Thread t1=new Thread(p);
           Thread t2=new Thread(c);
           Thread t3=new Thread(c);
           t.start();
           t1.start();
           t2.start();
           t3.start();
}
}
class ReSource
{
        private int count=1;
        private String name;
        private boolean flag=false;
        final Lock lock = new ReentrantLock();
        final Condition notFull  = lock.newCondition();
        final Condition notEmpty = lock.newCondition();


        public  void set(String name)
        {
                lock.lock();
                try{
                        while(flag)
                                try {
                                        notFull.await();
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                        this.name=name+"..."+count++;
                        System.out.println(Thread.currentThread().getName()+"生产者"+this.name);
                        flag=true;
                        notEmpty.signal();
                }finally
                {
                        lock.unlock();
                }
               
        }
        public synchronized void get()
        {
                lock.lock();
                try{
                        while(!flag)
                                try {
                                        notEmpty.await();
                                } catch (InterruptedException e) {
                                        // TODO Auto-generated catch block
                                        e.printStackTrace();
                                }
                       
                        System.out.println(Thread.currentThread().getName()+"消费者"+this.name);
                        flag=false;
                        notFull.signal();
                }finally
                {
                        lock.unlock();
                }
       
        }
}
class Produce implements Runnable
{
        private ReSource rs;
   public  Produce(ReSource rs)
    {
            this.rs=rs;
    }
        @Override
        public void run() {
                // TODO Auto-generated method stub
                while(true)
                {
                        rs.set("+商品+");       
                }
               
        }
       
}
class Custom implements Runnable
{
        private ReSource rs;
           public  Custom(ReSource rs)
            {
                    this.rs=rs;
            }
        @Override
        public void run() {
                // TODO Auto-generated method stub
                while(true)
                {
                        rs.get();
                }
        }
       
}
作者: yangshang1    时间: 2012-3-26 20:32
朋友们 捧捧场 白沉了
作者: 杨华威    时间: 2012-3-27 08:25
JDK1.5中提供了多线程升级解决方案。
将同步synchronized替换成实现Lock操作。
将Object中的wait,notify,notifyAll,替换成了condition对象。

作者: 李震 李震 李震    时间: 2012-3-30 08:25
相同点:lock能完成syncharonized所实现的所有功能
不同点:lock有比syncharonized更精确的线程语义和更好的性能。syncharonized会自动释放锁。而LOCK一定要程序员手动释放,并且必须在finally句中释放。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2