一个奇怪的线程问题 本帖最后由 weick 于 2011-02-10 11:45:04 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 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同步。 服务器端关闭Socket的疑问 请教一个算法:计算N项的Fibonacci数列的和,其中第N项是数列中最大的不超过4百万的数 关于多线程中为减少争用采用的锁崩溃方法 ### 有关java.nio库Selector的问题 ### 我用BufferedImage读入一张GIF图片,该图片没有底色,然后我g2d.drawImage,再保存为png,发现一个问题 !!!使用EXE4J生成JAVA可执行文件,总是报错,明天就交论文了.!!! JSP中可以使用接口吗? JTextField内容获取 这是什么问题? 关于tomcat Calendar中add方法怎么回事 Java 多线程问题
在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同步。