本帖最后由 sunyimaying1 于 2010-10-16 17:21:41 编辑

解决方案 »

  1.   

    synchronized ("一个共享资源"):这样才可以保持互斥的访问共享资源,
    你现在的count是r的一个局部变量,四个线程构不成互斥,无法同步
      

  2.   

    从楼主的代码来看就知道不合适了··怎么第一句就直接Runnable r=new Runnable()了?Runnable貌似是个接口吧??
      

  3.   

    不是这个原因。count 不是局部变量,而是成员变量,可以理解为“共享资源”。this 既然能拿来用,this.count 也应该是能用的。我试验了一下,Integer 型的 count 确实不行,但如果换一个别的类型的对象(比如 Object),就可以。的确很奇怪……
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)[/size]
      

  4.   

    Integer 型貌似如果直接复制的话,比如
    Integer i = 1;

    i=2;
    程序会认为i的地址已经改变了,所以用Integer锁不住。如果换成int[] i = {1};
    修改时用 i[0] = 2;
    锁定直接锁i,则可以锁住。
      

  5.   

    啊……有道理!
    ————————————————————————————————
    基于CSDN论坛提供的插件扩展功能,自己做了个签名档工具,分享给大家,欢迎技术交流 :)[/size]
      

  6.   

    从楼主的代码来看就知道不合适了··怎么第一句就直接Runnable r=new Runnable()了?Runnable貌似是个接口吧?? 
     
    ===========================================================================
    楼主没错,楼主在后面加了个匿名内部类
      

  7.   

    楼主,你这个帖子还没有给我分呢
    http://topic.csdn.net/u/20101016/09/85dbf47c-adbe-4fcb-8e91-d0cae2e0946d.html
    你的结贴率很低啊,这很伤我这种专心解答问题的人的心但是我还是可以就你这个问题进行说明
    第一、synchrinized有2种用法,用在方法声明——同步方法或synchrinized(obj:Object)形成同步区块,obj只能是引用类型而不能是基本数据类型,因为只有对象上才有锁
    楼上所谓的什么锁不住锁得住,建议以后不要再这样说了,好吗?
    synchrinized(obj:Object){}唯一正解是“进入区块的前提为获得对象上的锁”
    第二、你这个代码在没改之前确实形成了互斥,因为要进入同步区块必须先获得r上的锁,所以同一时间只有一个线程在卖票
    第三、synchronized (new Integer(count)).这样改之后没有互斥,因为每一个线程的代码运行只需取得这个新Integer上的锁,他们互不相关,同一时间内可以有多个线程在卖票就原来的代码挺好希望去看看互斥的原理和代码形式
    三个线程的synchronized 都用同一个对象试试,那就还要涉及到线程协作,不然一个人把票买光