黑马程序员技术交流社区

标题: 同步代码块解决线程共享数据的问题 [打印本页]

作者: caijunsong    时间: 2014-3-26 11:13
标题: 同步代码块解决线程共享数据的问题
本帖最后由 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>
复制代码



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



作者: caijunsong    时间: 2014-3-29 09:40
龙健 发表于 2014-3-27 10:26
什么是同步,你这里还涉及到同步代码块???你在主线程中new了四个对象,也就是说有四个线程在执行(注意: ...

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

这样这个锁对象 就是类中的成员变量 也就是说 四个线程中的锁对象是同一个
我的错误:锁对象是对象成员变量,我定义了四个线程对象,相应的创建了四个锁对象,
每个对象在访问同步数据,都用了自己的锁,所以才失败了 !!
作者: caijunsong    时间: 2014-3-29 09:43
谢谢回复 这个问题我懂了




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