为什么该方法不是线程安全的?

_stark 2018-07-31 04:22:39
public static void test(int threadNum) throws InterruptedException {
synchronized (count) {
/*
为什么这么使用不是线程安全的?
*/
count = count + 1;
}
}
...全文
143 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
_stark 2018-07-31
  • 打赏
  • 举报
回复
引用 4 楼 hyl13420904950 的回复:
[quote=引用 3 楼 bit_clearoff 的回复:]
[quote=引用 1 楼 hyl13420904950 的回复:]
这个要看你的count是不是同一个对象了,要是同一个对象,就是线程安全的,如果不同的线程调用这个方法的count不是同一对象,自然不是线程安全
这里奇怪的就是count定义成了static对象, 但是如果是synchronized(count) { // do something with count}的话,我发现不是线程安全的。
如果我再定义一个static对象obj ,synchronized(obj) { // do something with count } 这样就是线程安全的。[/quote]

执行了count+1会改变变量count的引用,这样锁就会不起作用,定义一个对象obj,这个对象未改变,永远锁的是一个对象,线程安全[/quote]ok
这里有bug 2018-07-31
  • 打赏
  • 举报
回复


引用 3 楼 bit_clearoff 的回复:
[quote=引用 1 楼 hyl13420904950 的回复:]
这个要看你的count是不是同一个对象了,要是同一个对象,就是线程安全的,如果不同的线程调用这个方法的count不是同一对象,自然不是线程安全
这里奇怪的就是count定义成了static对象, 但是如果是synchronized(count) { // do something with count}的话,我发现不是线程安全的。
如果我再定义一个static对象obj ,synchronized(obj) { // do something with count } 这样就是线程安全的。[/quote]

执行了count+1会改变变量count的引用,这样锁就会不起作用,定义一个对象obj,这个对象未改变,永远锁的是一个对象,线程安全
_stark 2018-07-31
  • 打赏
  • 举报
回复
引用 1 楼 hyl13420904950 的回复:
这个要看你的count是不是同一个对象了,要是同一个对象,就是线程安全的,如果不同的线程调用这个方法的count不是同一对象,自然不是线程安全
这里奇怪的就是count定义成了static对象, 但是如果是synchronized(count) { // do something with count}的话,我发现不是线程安全的。
如果我再定义一个static对象obj ,synchronized(obj) { // do something with count } 这样就是线程安全的。
_stark 2018-07-31
  • 打赏
  • 举报
回复
这里奇怪的就是count定义成了static对象, 但是如果是synchronized(count) { // do something with count}的话,我发现不是线程安全的。
如果我再定义一个static对象obj ,synchronized(obj) { // do something with count } 这样就是线程安全的。
这里有bug 2018-07-31
  • 打赏
  • 举报
回复
这个要看你的count是不是同一个对象了,要是同一个对象,就是线程安全的,如果不同的线程调用这个方法的count不是同一对象,自然不是线程安全

50,639

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧