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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 442851994 中级黑马   /  2012-11-3 16:33  /  1660 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

为什么线程的同步代码块 不使用同一把锁 还会出现相同的数据, 不使用同一把锁依旧存在隐患吗? 希望能够结合代码实例解释一下,谢谢

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

4 个回复

倒序浏览
不使用同一把锁会出现死锁的现象,并不是重复数据
因为两个线程在互相等待对方做动作
这个例子毕老师视频中有的
  1. if(flag)
  2.                 {
  3.                         synchronized(MyLock.locka)
  4.                         {
  5.                                 System.out.println("if locka");
  6.                                 synchronized(MyLock.lockb)
  7.                                 {
  8.                                         System.out.println("if lockb");
  9.                                 }
  10.                         }
  11.                 }
  12.                 else
  13.                 {
  14.                         synchronized(MyLock.lockb)
  15.                         {
  16.                                 System.out.println("else lockb");
  17.                                 synchronized(MyLock.locka)
  18.                                 {
  19.                                         System.out.println("else locka");
  20.                                 }
  21.                         }       
  22.                 }
复制代码

评分

参与人数 1技术分 +1 收起 理由
杨志 + 1

查看全部评分

回复 使用道具 举报
杨雪松 发表于 2012-11-3 16:59
不使用同一把锁会出现死锁的现象,并不是重复数据
因为两个线程在互相等待对方做动作
这个例子毕老师视频中 ...

你这个代码应该是使用同一把锁出现的死锁现象吧   你说的第一句话  “不使用同一把锁会出现死锁的现象” 能不能帮我把这句话用代码解释一下呢?谢谢了
回复 使用道具 举报
if(flag)
                {
                     synchronized(MyLock.lockb)//
                        {
                                System.out.println("if locka");
                               synchronized(MyLock.locka)//你把这个代码和上面个代码结合来看也就是这个线程的两个锁对调,这这样的情况下就会出现两个线程都持有一把锁,但是他们都不能够继续运行,因为他们运行所需要的第二把锁互相被队员持有,都不给对方,但是可以通过一个wait()的方法来让他们的其中一个释放锁。
                                {
                                        System.out.println("if lockb");
                                }
                        }
                }
                else
                {
                        synchronized(MyLock.lockb)
                        {
                                System.out.println("else lockb");
                                synchronized(MyLock.locka)
                                {
                                        System.out.println("else locka");
                                }
                        }        
                }

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
442851994 发表于 2012-11-4 12:27
你这个代码应该是使用同一把锁出现的死锁现象吧   你说的第一句话  “不使用同一把锁会出现死锁的现象”  ...

额 你可能没有看仔细,这确实是两把锁 一把锁有一个对象,这里建立了两个对象locka和lockb,代表两把锁
class MyLock
{
        static Object locka = new Object();
        static Object lockb = new Object();
}是这样建立的
而使用同一把锁不会出现死锁现象的

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 很给力!

查看全部评分

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