黑马程序员技术交流社区

标题: 大家帮我看下同步代码块为什么没有解决安全问题。谢谢 [打印本页]

作者: 花自凋零    时间: 2014-8-27 21:37
标题: 大家帮我看下同步代码块为什么没有解决安全问题。谢谢
public class ThreadDemo {
public static void main(String[] args) {
  // TODO Auto-generated method stub
Ticket t = new Ticket();
Thread t1 = new Thread(t);
Thread t2 = new Thread(t);
Thread t3 = new Thread(t);
Thread t4 = new Thread(t);
t1.start();
t2.start();
t3.start();
t4.start();
  
  
}
}
class Ticket implements Runnable {
private  int ticket = 100;
Ticket(){ }
public void run(){
  while(true){
   Object obj = new Object();
   synchronized (obj)
   {
    if(ticket>0)
    {
     try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}      // TODO Auto-generated catch block     
     System.out.println(Thread.currentThread().getName()+"..."+ticket--);
    }
   }
   
  }
  
}
}

作者: 天黑偷牛    时间: 2014-8-27 22:13
  Object obj = new Object();写错位置了,每循环一次就建一个新的obj,每次的锁都不一样
作者: 花自凋零    时间: 2014-8-27 22:27
天黑偷牛 发表于 2014-8-27 22:13
Object obj = new Object();写错位置了,每循环一次就建一个新的obj,每次的锁都不一样 ...

恩 ,把 Object obj = new Object(); 这句写在循环外面就解决了,谢谢!
作者: careit    时间: 2014-8-27 22:37
还可以将 synchronized(obj)改写为  synchronized (this) 这样就解决了最后的输出结果的非预期结果
作者: 谢建平    时间: 2014-8-28 08:32
  汗 毕老师就拿这个做示例过的 每次锁都不是同一个 肯定不行了
作者: 左脑想你    时间: 2014-8-28 09:35
每一次都是新的锁~~对象~~~




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