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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黄陂酷歌 中级黑马   /  2014-3-21 19:40  /  1235 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class Tick implements Runnable{
  2.         private int tick = 100;
  3.         Object obj = new Object();
  4.         public void run(){
  5.                 while(true){
  6.                         synchronized(obj){//obj可以是任意对象没有条件
  7.                                 if(tick>0){
  8.                                         try{Thread.sleep(10);}catch(Exception e){}
  9.                                         System.out.println(Thread.currentThread().getName()+" sall "+tick--);
  10.                                 }
  11.                                 else
  12.                                         return;
  13.                         }
  14.                 }
  15.         }
  16. }
复制代码

synchronized(ojb){}中的obj可以使任意对象
请问既然可以使任意对象也就是说这个obj对同步代码块没有实际意义那为什么要有obj而不直接是synchronized{}这样的格式呢?不解

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

8 个回复

倒序浏览
理论上来说是任意对象,其实不然,这个对象就好比是一个开关,一个线程进入前先要判断这个开关是否打开着,如果打开了则进入执行其中方法,进入后开关变成关闭状态,其他线程想执行的时候发现开关是关闭着的就进不来了,如果执行完了则开关又变成了打开状态。
synchronized(new Object)每次都new一个对象,其实就相当于一个程序进入前判断开关是打开的,进去执行了,然后又来一个线程发现对象是新的,相当于开关还是打开的,又进去执行了,这样同步就失败了,所以如果想同步,得保持对象是同一个对象。同理,也不能变成synchronized{}这种形式

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
这种写法一般是面试官考的,在开发中,synchronized关键字都写在方法上~
回复 使用道具 举报
本帖最后由 青木郎 于 2014-3-21 20:15 编辑

synchronized(obj)obj在这里是一个同步锁;举个现实中的例子:
你家有个大门,大门上有个锁洞,现在就是让你给大门加锁不让人随便进来,你说这个锁是不是可以使任意牌子的锁。虽然可以是任意锁,但是你不加锁是不是实现不了要求,没办法限制人进来,所以必须加锁。同步就是为了让不同对象或方法在对统一资源访问时,进行限定,让他们只能同一时间只能一个对象或方法访问,没了锁怎么限定

评分

参与人数 1技术分 +1 收起 理由
何伟超 + 1

查看全部评分

回复 使用道具 举报
不是没有关系。。synchronized(obj) synchronized相当于锁的外形。obj相当于锁的齿口。这样写表示。这把锁。
如果在线程里还有其他地方用的话。。会同步开启和关闭的。
回复 使用道具 举报
在开发过程中synchronized(obj){//obj会写一个具体的需要用到的锁,但老师是在做练习,Object是基类,用起来比较方便!:)
回复 使用道具 举报
就是每次进入线程前检测的一个岗兵,否则你没派哨兵,谁帮你看着呢
回复 使用道具 举报
       这个问题我也很困扰,搜集了一些资料是这样说的:JAVA对象和类在逻辑上都关联了一把锁。锁是什么?锁是一个变量,一个对象,还是一个函数,还是其他?同步中还有一个概念监视器。理解了锁、监视器这些概念就好办了。可是我看了很多遍还是不理解,单纯的举一些例子很难让人接受。但是没办法只能先记住先啊。

评分

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

查看全部评分

回复 使用道具 举报
追逐 高级黑马 2014-3-22 09:08:03
9#
虽然锁可以是任意的,但是要想是多线程同步,就必须用同一个锁
synchronized(new Object())中的new Object()每次都会new一个新的的对象。因为再试作为一个参数。所以只运行一次他就把锁释放了。当再来一个线程进行判断的时候。他又是一把新的锁。而新的锁默认的就是开启状态,所以把new Object()当成实参的话。就相当于每个线程进去判断锁的时候。你的锁都是新的。也就是默认开启的那种。也就相当于每次你的锁都相当于没锁上。而在外面new一个新的对象的话。那个对象一直是不变的,直到所有线程运行完毕才会释放这个对象的引用。

评分

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

查看全部评分

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