黑马程序员技术交流社区
标题:
关于线程同步代码块的问题
[打印本页]
作者:
黄陂酷歌
时间:
2014-3-21 19:40
标题:
关于线程同步代码块的问题
class Tick implements Runnable{
private int tick = 100;
Object obj = new Object();
public void run(){
while(true){
synchronized(obj){//obj可以是任意对象没有条件
if(tick>0){
try{Thread.sleep(10);}catch(Exception e){}
System.out.println(Thread.currentThread().getName()+" sall "+tick--);
}
else
return;
}
}
}
}
复制代码
synchronized(ojb){}中的obj可以使任意对象
请问既然可以使任意对象也就是说这个obj对同步代码块没有实际意义那为什么要有obj而不直接是synchronized{}这样的格式呢?不解
作者:
乔钰博
时间:
2014-3-21 19:50
理论上来说是任意对象,其实不然,这个对象就好比是一个开关,一个线程进入前先要判断这个开关是否打开着,如果打开了则进入执行其中方法,进入后开关变成关闭状态,其他线程想执行的时候发现开关是关闭着的就进不来了,如果执行完了则开关又变成了打开状态。
synchronized(new Object)每次都new一个对象,其实就相当于一个程序进入前判断开关是打开的,进去执行了,然后又来一个线程发现对象是新的,相当于开关还是打开的,又进去执行了,这样同步就失败了,所以如果想同步,得保持对象是同一个对象。同理,也不能变成synchronized{}这种形式
作者:
Ranger
时间:
2014-3-21 19:54
这种写法一般是面试官考的,在开发中,synchronized关键字都写在方法上~
作者:
青木郎
时间:
2014-3-21 20:02
本帖最后由 青木郎 于 2014-3-21 20:15 编辑
synchronized(obj)obj在这里是一个同步锁;举个现实中的例子:
你家有个大门,大门上有个锁洞,现在就是让你给大门加锁不让人随便进来,你说这个锁是不是可以使任意牌子的锁。虽然可以是任意锁,但是你不加锁是不是实现不了要求,没办法限制人进来,所以必须加锁。同步就是为了让不同对象或方法在对统一资源访问时,进行限定,让他们只能同一时间只能一个对象或方法访问,没了锁怎么限定
作者:
李厚斌
时间:
2014-3-21 20:41
不是没有关系。。synchronized(obj) synchronized相当于锁的外形。obj相当于锁的齿口。这样写表示。这把锁。
如果在线程里还有其他地方用的话。。会同步开启和关闭的。
作者:
刘先斌
时间:
2014-3-21 21:13
在开发过程中synchronized(obj){//obj会写一个具体的需要用到的锁,但老师是在做练习,Object是基类,用起来比较方便!:)
作者:
endlessjoker
时间:
2014-3-21 21:23
就是每次进入线程前检测的一个岗兵,否则你没派哨兵,谁帮你看着呢
作者:
牛头人图腾
时间:
2014-3-21 23:51
这个问题我也很困扰,搜集了一些资料是这样说的:JAVA对象和类在逻辑上都关联了一把锁。锁是什么?锁是一个变量,一个对象,还是一个函数,还是其他?同步中还有一个概念监视器。理解了锁、监视器这些概念就好办了。可是我看了很多遍还是不理解,单纯的举一些例子很难让人接受。但是没办法只能先记住先啊。
作者:
追逐
时间:
2014-3-22 09:08
虽然锁可以是任意的,但是要想是多线程同步,就必须用同一个锁
synchronized(new Object())中的new Object()每次都会new一个新的的对象。因为再试作为一个参数。所以只运行一次他就把锁释放了。当再来一个线程进行判断的时候。他又是一把新的锁。而新的锁默认的就是开启状态,所以把new Object()当成实参的话。就相当于每个线程进去判断锁的时候。你的锁都是新的。也就是默认开启的那种。也就相当于每次你的锁都相当于没锁上。而在外面new一个新的对象的话。那个对象一直是不变的,直到所有线程运行完毕才会释放这个对象的引用。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2