黑马程序员技术交流社区

标题: 关于线程问题 [打印本页]

作者: 浪无痕-陈文坤    时间: 2013-8-5 07:35
标题: 关于线程问题
本帖最后由 浪无痕-陈文坤 于 2013-8-5 09:36 编辑

class Bank
{
        private int sum;        //共享数据
        Object obj=new Object();
        public void add(int n)
        {
                synchronized(obj)        //这里有两句,所以需要锁
                {
                        sum=sum+n;
                        try
                        {
                                Thread.sleep(10);
                        }
                        catch (Exception e)
                        {
                        }
                System.out.println("sum="+sum);
                }
        }
}
class Cus implements Runnable
{
        private Bank b=new Bank();        //共享数据
        public void run()        //多线程运行代码
        {
                for (int x=0;x<3 ;x++ )
                {
                        b.add(100);
                }
        }
}
class  BankDemo
{
        public static void main(String[] args)
        {
                Cus c=new Cus();
                Thread t1=new Thread(c);
                Thread t2=new Thread(c);
                t1.start();
                t2.start();
        }
}
其中Object对象作为锁,不是太明白,这个上锁怎么体现出来,谢谢!!
作者: breaveheart    时间: 2013-8-5 08:58
object相当于监视器要监视的对象.
当一个对象被监视器监视的时候,
同一时刻只能有一个线程访问它,
其它要访问它的线程必须在等待队列中等待。
等执行的线程进行完了,
等待队列的线程才能进入。
作者: 杨玲    时间: 2013-8-5 09:00
呵呵,你要先搞明白synchronized(obj) 这句话,它其实就是把这个obj作为了锁,而在你的代码里面这个obj是唯一的嘛,你看,你的线程方法类Cus中,只有一个private Bank b=new Bank();       ,而在Bank这个对象中又只有一个obj,所以这一个锁就可以被你的t1和t2所共享,两个线程就实现了同步,如果你让obj在没一个线程中都有一个,那个这个锁就只能作用于每一个线程,而多个线程实际上是没有同步的,比方说你把Cus c=new Cus();多new出来一个就向下面这样,
  1. Cus c=new Cus();
  2. Cus c1 = new Cus()
  3.                 Thread t1=new Thread(c);
  4.                 Thread t2=new Thread(c1);
  5.                 t1.start();
  6.                 t2.start();
复制代码
这样就不同步了
作者: 薛鹏鹏    时间: 2013-8-5 09:15
锁形象比喻下,就相当于古代调兵的虎符,
当一个线程读到这里synchronized(obj) ,可以认为这个线程将锁分成两半,线程带着其中的一半继续运行。
另外一个线程读到这里synchronized(obj) ,它没有锁的那一半,就像虎符一样,没有另外一半就不能调动兵力,线程也就进不来,直到带着锁的那个线程运行完毕,它才能进来。然后它也是带着锁运行。。。。。。。


其实这个锁只要保证是唯一的,用谁都可以,比如你自己再定义一个变量放进去也行。
作者: 浪无痕-陈文坤    时间: 2013-8-5 09:34
杨玲 发表于 2013-8-5 09:00
呵呵,你要先搞明白synchronized(obj) 这句话,它其实就是把这个obj作为了锁,而在你的代码里面这个obj是唯 ...

谢谢!!!
作者: 浪无痕-陈文坤    时间: 2013-8-5 09:34
薛鹏鹏 发表于 2013-8-5 09:15
锁形象比喻下,就相当于古代调兵的虎符,
当一个线程读到这里synchronized(obj) ,可以认为这个线程将锁分 ...

谢谢!!!
作者: 浪无痕-陈文坤    时间: 2013-8-5 09:35
breaveheart 发表于 2013-8-5 08:58
object相当于监视器要监视的对象.
当一个对象被监视器监视的时候,
同一时刻只能有一个线程访问它,

谢了!!!




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