黑马程序员技术交流社区

标题: Java中synchronized对线程的应用困惑 [打印本页]

作者: DuckJava    时间: 2014-12-10 10:10
标题: Java中synchronized对线程的应用困惑
       无意发现,synchronized(对象) {...},中的对象貌似不可以使用匿名对象.如果使用匿名对象,貌似起不到锁的效果。大神指教??
PS:如果我把代码放在帖子的代码<>里面,根本显示不出,层次括号。我还是直接放在文档中了吧。
<code>
class Ticket implements Runnable{        Object obj = new Object();        private int tick = 1050;        /*   //-ok --1        Ticket(int tick)        {                this.tick = tick;        }        */        public void run()// throws InterruptedException        {                while(true)                {                        synchronized(new Object())//--这里如果使用匿名对象,起不到监视作用                        {                                if(tick>0)                                {                                                                        try { Thread.sleep(10);} catch (Exception e) {}                                        System.out.print(Thread.currentThread().getName()+".."+ tick--+"  ");                                        //throw new InterruptedException(); //--error-只能catch,不能throw。因为父类run没有throws                                }                        }                                }        }}class ThreadSafeDemo{        public static void main(String[] args)        {                //Ticket t = new Ticket(100); //-ok --1                Ticket t = new Ticket();                Thread th1 = new Thread(t);                Thread th2 = new Thread(t);                Thread th3 = new Thread(t);                th1.start();                th2.start();                th3.start();                        }}</code>运行结果如下(最有一小段):Thread-2..2
Thread-1..1
Thread-0..0
Thread-2..-1。————————————————————————————————————————————    不多说,这个结果大家也看到了。so,what is the reason ?  who can help me??? file:///C:/Users/ADMINI~1/AppData/Local/Temp/SGTpbq/1620/00809906.gif   






1.jpg (76.9 KB, 下载次数: 34)

运行结果

运行结果

作者: rettey    时间: 2014-12-10 10:21
本帖最后由 rettey 于 2014-12-10 10:22 编辑

你这样用等于每次都是使用不同的锁,当然不能起作用了
while每执行一次创建一个新锁
作者: DuckJava    时间: 2014-12-10 10:32
rettey 发表于 2014-12-10 10:21
你这样用等于每次都是使用不同的锁,当然不能起作用了
while每执行一次创建一个新锁 ...

哦,你说 的我大致明白了。还是共享和非共享的问题。3Q
作者: rettey    时间: 2014-12-10 10:44
DuckJava 发表于 2014-12-10 10:32
哦,你说 的我大致明白了。还是共享和非共享的问题。3Q

我也是新手,一起进步!!!!
作者: fatesabering    时间: 2014-12-10 11:07
一个同步中应该只有一个锁,也就是对象必须唯一。
作者: 眸眼前缘    时间: 2014-12-10 12:39
synchronized(new Object())前面要加判断if判断,要不结束后,循环还在继续,还有线程在循环内
作者: wtjohn    时间: 2014-12-10 14:05
必须是同一个锁啊。匿名对象不就两个锁了吗
作者: DuckJava    时间: 2014-12-10 15:22
眸眼前缘 发表于 2014-12-10 12:39
synchronized(new Object())前面要加判断if判断,要不结束后,循环还在继续,还有线程在循环内 ...

求代码演示




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