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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 浪无痕-陈文坤 中级黑马   /  2013-8-5 07:35  /  1198 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 浪无痕-陈文坤 于 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对象作为锁,不是太明白,这个上锁怎么体现出来,谢谢!!

6 个回复

倒序浏览
object相当于监视器要监视的对象.
当一个对象被监视器监视的时候,
同一时刻只能有一个线程访问它,
其它要访问它的线程必须在等待队列中等待。
等执行的线程进行完了,
等待队列的线程才能进入。
回复 使用道具 举报
呵呵,你要先搞明白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();
复制代码
这样就不同步了
回复 使用道具 举报
锁形象比喻下,就相当于古代调兵的虎符,
当一个线程读到这里synchronized(obj) ,可以认为这个线程将锁分成两半,线程带着其中的一半继续运行。
另外一个线程读到这里synchronized(obj) ,它没有锁的那一半,就像虎符一样,没有另外一半就不能调动兵力,线程也就进不来,直到带着锁的那个线程运行完毕,它才能进来。然后它也是带着锁运行。。。。。。。


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

谢谢!!!
回复 使用道具 举报
薛鹏鹏 发表于 2013-8-5 09:15
锁形象比喻下,就相当于古代调兵的虎符,
当一个线程读到这里synchronized(obj) ,可以认为这个线程将锁分 ...

谢谢!!!
回复 使用道具 举报
breaveheart 发表于 2013-8-5 08:58
object相当于监视器要监视的对象.
当一个对象被监视器监视的时候,
同一时刻只能有一个线程访问它,

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