Java 多线程 synchoronized 关键字问题

2018 年 12 月 5 日
 wenb1
刚开始学多线程,今天在网上看到了下面这个例子,给出的解释是 static 的锁是在 Counter.class 里,非 static 的锁是在 this object 里,它们两个可以同时使用,所以会导致线程不安全。我想问的是在什么样的具体实例里调用这两个方法会导致线程不安全,比如我有线程 1 和线程 2,我想让线程 1 调用 setter,然后线程 2 再调用 getter。在这种情况下,就算都上 static synchoronized 锁,我也不能保证调度器一定先调用线程 1,再调用线程 2 啊?跟不上锁有什么区别?我可以都不上锁,然后调用线程 1 执行 setter,再调用线程 2 执行 getter。

求大佬们指点!!多谢了!

代码如下:

public class Counter{

private static int count = 0;

public static synchronized int getCount(){
return count;
}

public synchoronized setCount(int count){
this.count = count;
}

}

原文 link: https://javarevisited.blogspot.com/2011/04/synchronization-in-java-synchronized.html
4511 次点击
所在节点    Java
38 条回复
vansl
2018 年 12 月 5 日
@lhx2008 没有用 volatile 修饰还是会出现内存可见性问题
wenb1
2018 年 12 月 5 日
@vansl 我觉得你说的非常有道理!我去看看,多谢了!!
lhx2008
2018 年 12 月 5 日
@lihongjie0209 不过 9 和 10,这个,明明是这个代码写的太蠢了。。你加不加锁都一样
lhx2008
2018 年 12 月 5 日
@vansl 是的,忘了这个
wenb1
2018 年 12 月 5 日
@lihongjie0209 多谢!我对这个例子有了更深的理解!
lihongjie0209
2018 年 12 月 5 日
@lhx2008 废话, 没看到题主说的: 我想问的是在什么样的具体实例里调用这两个方法会导致线程不安全?
lihongjie0209
2018 年 12 月 5 日
@vansl https://gist.github.com/lihongjie0209/26c966b808c03075427d7c72ff34a707 这段代码会一直运行, 哪怕有 volatile 修饰也会有内存可见性问题
Ico945
2018 年 12 月 5 日
锁保证的是共享区(变量)一次只能由一个线程操作,并不能保证线程的执行顺序
MoHen9
2018 年 12 月 5 日
synchronized 是信号量,状态被放在对象头里面, 我们常说被 static 修饰的方法属于类,内存中有唯一的一个 Class 对象对应着当前类,而这个对象的对象头存放着被 static 修饰的 synchronized 的状态,没有 static 修饰的方法,synchronized 的状态存放在当前对象中。所以,你这是两把锁,想要保证同一个变量的安全。你可以都加 static,或者都不加,或者使用一个单独的对象锁存放 synchronized 的状态。
araraloren
2018 年 12 月 5 日
楼主可以了解一下啥叫互斥,啥叫同步
sagaxu
2018 年 12 月 5 日
@lhx2008 long 类型的写入在某些 arch 下不是原子操作。即使是原子操作,也需要某种同步方式解决内存可见性问题。同一个线程内代码顺序建立 happens-before 关系,不同线程之间要靠同步机制建立。
wenb1
2018 年 12 月 5 日
感谢所有回答我问题的大佬,我继续去学习了!有问题我还会回来的。。。
azhangbing
2018 年 12 月 5 日
楼主可以看这个 http://www.iteye.com/topic/806990 这叫线程生产者消费者
20015jjw
2018 年 12 月 5 日
看中文说这个根本看不懂。。。
wenb1
2018 年 12 月 5 日
@azhangbing 你说的很有道理,我去看看,多谢了
wenb1
2018 年 12 月 5 日
@20015jjw 我是中英文结合,书看英文的,视频看中文的
log4geek
2018 年 12 月 13 日
dezhou9
2019 年 1 月 5 日
信号量和读写锁都不如 rcu 性能好

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/514393

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX