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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© DuckJava 中级黑马   /  2014-12-10 10:10  /  1019 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

       无意发现,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, 下载次数: 18)

运行结果

运行结果

7 个回复

倒序浏览
本帖最后由 rettey 于 2014-12-10 10:22 编辑

你这样用等于每次都是使用不同的锁,当然不能起作用了
while每执行一次创建一个新锁
回复 使用道具 举报
rettey 发表于 2014-12-10 10:21
你这样用等于每次都是使用不同的锁,当然不能起作用了
while每执行一次创建一个新锁 ...

哦,你说 的我大致明白了。还是共享和非共享的问题。3Q
回复 使用道具 举报
DuckJava 发表于 2014-12-10 10:32
哦,你说 的我大致明白了。还是共享和非共享的问题。3Q

我也是新手,一起进步!!!!
回复 使用道具 举报
一个同步中应该只有一个锁,也就是对象必须唯一。
回复 使用道具 举报
synchronized(new Object())前面要加判断if判断,要不结束后,循环还在继续,还有线程在循环内
回复 使用道具 举报
wtjohn 中级黑马 2014-12-10 14:05:34
7#
必须是同一个锁啊。匿名对象不就两个锁了吗
回复 使用道具 举报
眸眼前缘 发表于 2014-12-10 12:39
synchronized(new Object())前面要加判断if判断,要不结束后,循环还在继续,还有线程在循环内 ...

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