A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Chaiber 中级黑马   /  2012-12-10 11:15  /  2230 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 Chaiber 于 2012-12-10 14:23 编辑

我想问下,Lock能否完全代替Synchronized?如果不能,请说明下。

顺便问下,比如面试会不会还考Synchronized,是不是只要记住wait,notify,notifyAll几个关键字就足够了。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

4 个回复

正序浏览
谢谢几位的回答,记下了
回复 使用道具 举报
Lock不能能完全代替Synchronized
1.Lock可以在需要一些 synchronized 所没有的特性的时候使用,比如时间锁等候、可中断锁等候、无块结构锁、多个条件变量或者锁投票。
2.ReentrantLock 还具有可伸缩性的好处,应当在高度争用的情况下使用它,大多数 synchronized 块几乎从来没有出现过争用,所以可以把高度争用放在一边。

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
  首先分析下Lock与synchronized异同点:
       主要相同点:Lock 能完成 synchronized 所实现的所有功能
       主要不同点:Lock 有比 synchronized 更精确的线程语义和更好的性能。synchronized 会自动释放锁,而 Lock 一定要求程序员手工释放,并且必须在 finally 代码块中释放。Lock 还有更强大的功能,例如,它的 tryLock 方法可以非阻塞方式去拿锁。
       public class LockTest {

        private int j;
        private Lock lock = new ReentrantLock();

        public static void main(String[] args) {
                LockTest test = new LockTest();
                for(int i=0;i<2;i++){
                        new Thread(test.new LockThread()).start();
                }

        }

        private class LockThread implements Runnable {
                public void run() {
                        while (true) {
                                /*
                                 * synchronized (ThreadTest.this) {
                                 *   System.out.println("j--=" +j--); //这里抛异常了,锁不能释放
                                 * }
                                 */
                                lock.lock();
                                try {
                                        System.out.println("j--=" + j--);
                                } finally {
                                        lock.unlock();        //lock是手动释放锁
                                }
                        }
                }
        }

}

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
替换是肯定能替换的,lock的出现就是为了解决synchronized的死锁的局限性,同一个锁可以有多个condition对象,从根本上杜绝了死锁的产生。至于面试就不是能预测的了。以上是我的观点,希望能有帮助

评分

参与人数 1技术分 +1 收起 理由
刘芮铭 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马