Questions tagged «synchronized»

如果块或方法的入口是由Java的“ synchronized”关键字控制的,则称该块或方法为“同步”。这导致对它的访问一次被限制为单个线程:当并发访问发生时,它们以未指定的顺序进行顺序化。



22
避免在Java中同步(this)?
每当关于Java同步的问题浮出水面时,有些人就会很想指出synchronized(this)应该避免的事情。他们声称,取而代之的是,最好是锁定私有引用。 给出的一些原因是: 一些邪恶的代码可能会窃取您的锁(非常流行,也有一个“偶然的”变体) 同一类中的所有同步方法都使用完全相同的锁,这会降低吞吐量 您(不必要地)暴露了太多信息 包括我在内的其他人则认为,这synchronized(this)是一个惯用语言(在Java库中也是如此),是安全且易于理解的。应当避免这种情况,因为您有一个错误,而且对多线程程序中正在发生的事情一无所知。换句话说:如果适用,请使用它。 我对看到一些真实的示例(没有foobar的东西)感兴趣,在这种情况下,避免锁定this也更可取synchronized(this)。 因此:您是否应该始终避免synchronized(this)使用私有引用锁定并将其替换? 一些进一步的信息(根据给出的答案进行更新): 我们正在谈论实例同步 的隐式(synchronized方法)和显式形式synchronized(this)都被考虑 如果您引用Bloch或有关该主题的其他权威,请不要遗漏您不喜欢的部分(例如,Effective Java,Thread Safety上的项目:通常是实例本身的锁,但也有例外)。 如果您需要锁定而不是synchronized(this)提供粒度,synchronized(this)则不适用,所以这不是问题

4
Java中的volatile和Synchronized之间的区别
我想知道将变量声明为as volatile和始终synchronized(this)在Java块中访问变量之间的区别吗? 根据本文http://www.javamex.com/tutorials/synchronization_volatile.shtml可以说很多,有很多区别,但也有一些相似之处。 我对这段信息特别感兴趣: ... 访问volatile变量永远不会阻塞:我们只做简单的读取或写入操作,因此与同步块不同,我们永远不会保持任何锁; 因为访问易失性变量永远不会持有锁,所以它不适用于我们希望以原子操作方式进行读写更新的情况(除非我们准备“错过更新”); 读-更新-写是什么意思?写不仅是更新,还是仅表示更新是取决于读取的写? 最重要的是,何时声明变量volatile而不是通过synchronized块访问变量更合适?volatile对依赖于输入的变量使用它是一个好主意吗?例如,有一个称为的变量render可以通过渲染循环读取并由keypress事件设置吗?

2
Java 8接口方法中不允许“同步”的原因是什么?
在Java 8中,我可以轻松地编写: interface Interface1 { default void method1() { synchronized (this) { // Something } } static void method2() { synchronized (Interface1.class) { // Something } } } 我将获得在类中也可以使用的完整同步语义。但是,我不能synchronized在方法声明上使用修饰符: interface Interface2 { default synchronized void method1() { // ^^^^^^^^^^^^ Modifier 'synchronized' not allowed here } static synchronized void method2() { …

11
Java同步方法锁定对象还是方法?
如果我在同一个类中有2个同步方法,但是每个方法都访问不同的变量,那么2个线程可以同时访问这2个方法吗?锁是否发生在对象上,或者是否与同步方法中的变量一样具体? 例: class X { private int a; private int b; public synchronized void addA(){ a++; } public synchronized void addB(){ b++; } } 2个线程可以访问类X执行相同的实例x.addA(),并x.addB()在同一时间?

12
如果我在同一个类上同步了两个方法,它们可以同时运行吗?
如果我在同一个类上同步了两个方法,那么它们可以同时在同一个对象上运行吗?例如: class A { public synchronized void methodA() { //method A } public synchronized void methodB() { // method B } } 我知道我不能methodA()在两个不同的线程中的同一对象上运行两次。在methodB()。 但是我可以methodB()在methodA()仍然运行时在其他线程上运行吗?(相同的对象)



8
非最终字段的同步
每次我在非最终类别字段上进行同步时,都会显示警告。这是代码: public class X { private Object o; public void setO(Object o) { this.o = o; } public void x() { synchronized (o) // synchronization on a non-final field { } } } 所以我通过以下方式更改了编码: public class X { private final Object o; public X() { o = new Object(); } …

10
在Java关键部分中,应该同步哪些内容?
在Java中,在代码中声明关键部分的惯用方式如下: private void doSomething() { // thread-safe code synchronized(this) { // thread-unsafe code } // thread-safe code } 几乎所有块都在上同步 this,但是是否有特定原因呢?还有其他可能性吗?关于要同步的对象,是否有最佳实践?(例如Object?的私有实例)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.