线程同步问题,帮回答下
java吧
全部回复
仅看楼主
level 3
7-X
楼主
这里面的 run方法,需要那个同步么,我觉的没必要,因为这个又不是共享变量。。但又多次出现,现在困惑了。。。
2013年07月09日 11点07分
1
level 11
GrandisGranva
如果1个Horse对象,被许多线程执行run方法,就应该同步strides!
2013年07月09日 11点07分
2
7-X
难道这是传说中的”防患于未然“?这个例子中,Horse并不是共享对象。。
2013年07月09日 12点07分
GrandisGranva
回复 丶东亭 :会有别的线程使用getStrides方法,这个时候strides不应该被+=!
2013年07月09日 12点07分
7-X
回复 GrandisGranva :why? strides又不是共享变量,每个Horse都有一个自己的,修改它又不影响其他的Horse
2013年07月09日 16点07分
GrandisGranva
回复 丶东亭 :因为有个getStrides方法,所以,就是这样了!
2013年07月09日 17点07分
level 3
7-X
楼主
这是另外一个文件的调用....所有线程都有一个Horse实例,唯一共享的就是CyclicBarrier对象
2013年07月09日 18点07分
3
GrandisGranva
如果所有Horse只移动1次,那么不同步strides没有问题,但是显然不是只移动1次,当所有Horse全部await后,CyclicBarrier的任务会触发,这个任务会直接和间接调用getStrides方法,并且与此同时,所有Horse开始了新一轮移动,这里会改变strides,也就是说对strides的访问与修改并发进行中..
2013年07月10日 14点07分
7-X
正解,刚看了下源代码.CyclicBarrier在计数变0,执行run 方法时,会唤醒所有被CyclicBarrier阻塞的线程,这里的确就会产生并发了...谢谢了..
2013年07月10日 14点07分
GrandisGranva
回复 丶东亭 :客气!
2013年07月10日 14点07分
1