黑马程序员技术交流社区

标题: 线程的同步问题。 [打印本页]

作者: 442851994    时间: 2012-11-3 16:33
标题: 线程的同步问题。
为什么线程的同步代码块 不使用同一把锁 还会出现相同的数据, 不使用同一把锁依旧存在隐患吗? 希望能够结合代码实例解释一下,谢谢
作者: 杨雪松    时间: 2012-11-3 16:59
不使用同一把锁会出现死锁的现象,并不是重复数据
因为两个线程在互相等待对方做动作
这个例子毕老师视频中有的
  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.                 }
复制代码

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

你这个代码应该是使用同一把锁出现的死锁现象吧   你说的第一句话  “不使用同一把锁会出现死锁的现象” 能不能帮我把这句话用代码解释一下呢?谢谢了
作者: 张超    时间: 2012-11-4 13:36
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");
                                }
                        }        
                }
作者: 杨雪松    时间: 2012-11-4 18:11
442851994 发表于 2012-11-4 12:27
你这个代码应该是使用同一把锁出现的死锁现象吧   你说的第一句话  “不使用同一把锁会出现死锁的现象”  ...

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




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