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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© caijunsong 中级黑马   /  2014-3-26 11:13  /  1167 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 caijunsong 于 2014-3-29 09:43 编辑

  1. <P>class Ticket extends Thread{
  2. private static int tickNum =10; //把这个设置为静态的 那么创建多个线程,就能够共享这个数据
  3. private Object objLock =new Object(); //设置同步类对象
  4. public void run(){
  5. while(true){

  6. //同步代码块
  7. synchronized(objLock){
  8. if(tickNum <=0)
  9. break;

  10. try {
  11. Thread.sleep(10);
  12. }catch (InterruptedException e) {
  13. // TODO Auto-generated catch block
  14. e.printStackTrace();
  15. }

  16. System.out.println(Thread.currentThread()+". sale: ticket"+ tickNum--);
  17. }
  18. }
  19. }
  20. }
  21. public class TicketdemoCompare
  22. {
  23. public static void main(String[] args)
  24. {
  25. Ticket t1 =new Ticket();
  26. Ticket t2=new Ticket();
  27. Ticket t3=new Ticket();
  28. Ticket t4=new Ticket();

  29. t1.start();
  30. t2.start();
  31. t3.start();
  32. t4.start();
  33. }
  34. } </P>
  35. <P>//运行结果还是出现了问题,还是没有同步好 代码哪出现了问题</P>
复制代码


4 个回复

倒序浏览
什么是同步,你这里还涉及到同步代码块???你在主线程中new了四个对象,也就是说有四个线程在执行(注意:四个线程执行的不是同一个代码块),但是他们执行的是各自的代码块,根本就没有涉及到线程安全问题,你的同步锁只是个摆设摆了,毫无意义,涉及到多线程的的基本条件是:多个线程同时操作一个对象,操作对象的语句有两条以上,你这里第一个条件都没有满足,
个人理解,希望可以帮你解惑,谢谢、、、
回复 使用道具 举报
new了4个Thread对象,即四个线程分别执行四个对象中的代码,因此便是四个线程去独立地完成卖票的任务;
可以用下面的代码, 不用继承Thread而是使用实现接口的方法


回复 使用道具 举报
龙健 发表于 2014-3-27 10:26
什么是同步,你这里还涉及到同步代码块???你在主线程中new了四个对象,也就是说有四个线程在执行(注意: ...

看书 所谓的同步就是解决多线程之间共享数据,造成的数据更改不同步的问题
用锁的前提
              两个线程或以上        用同一个锁          线程共享数据并非一定是要操作同一对象  在我的代码中,虽然是创建了四个线程对象,但是四个线程中都访问了Thread中定义好的静态变量ticketNum,在类中定义的静态变量,不就是类变量,所以 四个线程访问的是同一个共有的数据
因此设计到了安全问题
然后最近看了别人的帖子 发现我我的错误 原来是锁对象出现了问题
只要把 private Object objLock =new Object();在声明处加一个static
也就是private static Object objLock =new Object();

这样这个锁对象 就是类中的成员变量 也就是说 四个线程中的锁对象是同一个
我的错误:锁对象是对象成员变量,我定义了四个线程对象,相应的创建了四个锁对象,
每个对象在访问同步数据,都用了自己的锁,所以才失败了 !!
回复 使用道具 举报
谢谢回复 这个问题我懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马