本帖最后由 weick 于 2011-02-10 11:45:04 编辑

解决方案 »

  1.   

    LZ没理解好同步
    在get和put中,分别对两个资源进行“锁”,即synchronized(p)和synchronized(c)
    假设线程Thread(producter)先进入put,然后synchronized(p),这说明Thread(producter)占用了p,线程Thread(c)在这个时候不能使用p,必须等待producer释放p,但是这个时候Thread(c)可以进入方法get,然后synchronized(c),这里Thread(c)并没有去抢资源p,所以不会发生任何等待,synchronized(c)里的代码一样被执行,直到number--;后,synchronized(p)时,Thread(c)才必须等待Thread(producer)释放p
    两个线程,是在执行synchronized(同一个资源)时才会发生排他锁而等待,而LZ你的情况,是在一个方法中synchronized两个资源,也就是说,线程是在这两个资源中交叉排他等待,这个交叉的中间,代码number--;和number++;照样执行的,所以肯定不能保证number同步。