黑马程序员技术交流社区

标题: 多线程的安全问题(synchronized) [打印本页]

作者: 嘻嘻哈哈嘻嘻    时间: 2014-7-16 15:34
标题: 多线程的安全问题(synchronized)
package xianchen;

class ticks2 implements Runnable//extends Thread
{
private int ticks = 100;
public void run()
{
  Object b = new Object();
  while(true)
  {
   synchronized(b)   //通过synchronized,同步代码块
   {
    if(ticks > 0)
    {
     try
     {
      Thread.sleep(10);
     }
     catch(Exception e)
     {
      
     }
     System.out.println(Thread.currentThread().getName()+"出票"+ticks--);
    }
   }
  }
}
}
public class test4 {
/**
  * @param args
  */
public static void main(String[] args) {
  // TODO Auto-generated method stub
  
  ticks2 t = new ticks2();
  
  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();

}
}
运行后还有打印出有负数的票,这是为什么?

同步代码块Synchronized.jpg (56.21 KB, 下载次数: 5)

运行后还是打印出有负数的票

运行后还是打印出有负数的票

作者: 人心如水    时间: 2014-7-16 19:21
问题很明显啊,锁对象放run方法外面,你这样开启一个线程就给了一把锁,等于没加锁,锁只能有一个的
作者: 花花公子    时间: 2014-7-16 21:11
当你的程序运行到1票时,票数还是大于0,就要TRY,其中一个线程就得等待,其他线程就直接打印了。我的理解




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