- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
以下类在 Java 中是否等价?如果不是,为什么?
class Abc {
private int c = 0;
<pre><code>public synchronized void add(int a) {
c += a;
}
public synchronized void subtract(int a) {
c -= a;
</code></pre>
}
}
class Def {
private int c = 0;
private final Object lock = new Object();
<pre><code>public void add(int a) {
synchronized(lock) {
c += a;
}
}
public void subtract(int a) {
synchronized(lock) {
c -= a;
}
</code></pre>
}
}
此外,在 Def
中使用 this
作为同步参数而不是 lock
会出现什么问题?以下是问题所在吗?
Def def = new Def()
synchronized (def) {
def.add(5); //originates deadlock? or is this allowed AS LONG
//as all this happens in the same thread?
}
Java中的synchronized语句和C#的lock语句一样吗?如果不是,它们的区别是什么?如果是,为什么 C# 不像 Java 那样也允许锁定方法?
所以我猜 synchronized (this)
的问题可以用下面的例子来描述?
class Xyz {
private int c;
<pre><code> public void add(int a) {
synchronized(this) {
c += a;
}
}
public void subtract(int a) {
synchronized(this) {
c -= a;
}
}
public void show666() {
return 666;
}
</code></pre>
}
线程 1 调用 xyz.add(0)
,同时线程 2 尝试调用 xyz.show666()
。 Thread2 必须等待 Thread1 完成 xyz.add(0)
althtough 它不需要任何与锁直接相关的信息。是吗?
最佳答案
1 Are the following classes equivalent in Java? if no, why?
它们因同步的实例不同而不同,因此会受到这些实例之间差异的影响。
Class Abc
使用调用该方法的 Abc
实例。其他有权访问该实例的代码也可以通过在同步块(synchronized block)中显式使用该实例来使用它进行同步。
Def
类中的同步代码块明确命名了它们与之同步的实例。由于此实例是 Def
实例私有(private)的,因此 Def
外部的代码无法使用它进行同步(除非该实例以某种方式泄露)。
有些人可能会争辩说 Def
方法安全得多,封装你的锁很重要,原因与你应该使用私有(private)实例变量的原因相同。
最后,synchronized 关键字和使用 synchronized 语句是有区别的,例如synchronized 语句可以锁定任何对象,而不仅仅是执行代码的实例,synchronize 关键字稍微更有效等。
2a Also, what would be the problem of in Def, using this as synchronized parameter instead of lock?
没问题。在实例方法上使用 synchronized 关键字在语义上等同于将方法的代码包装在在 this
上同步的同步块(synchronized block)中(synchronized 关键字稍微更有效)。在静态方法上使用 synchronized 关键字与在类本身上使用 synchronized block 相同(例如 synchronized(FooBar.class) { ... }
)。
2b Is the following the problem?
不,Java 中的锁是可重入的,这只是意味着在保护实例上持有锁的线程可以进入和退出在同一实例上同步的任何其他代码块。
3a Are synchronized statements in Java just like C#'s lock statements? If no, what are their differences?
语义等价。
但请注意关于 Monitor.Enter
和 Monitor.Exit
的回答
Are there any differences between Java's "synchronized" and C#'s "lock"?
3b If yes, why doesn't C# also allow to lock the methods, like Java allows?
确实如此 - 使用 [MethodImpl(MethodImplOptions.Synchronized)]
注释。
4 Thread1 calls xyz.add(0) and at the same time Thread2 tries to call xyz.show666(). Thread2 has to wait for Thread1 to finish with xyz.add(0) althtough it doesn't need any info directly related with the lock. Is that it?
不,很多人认为“锁定”一个实例会影响整个实例。它只影响在该实例上同步的同步代码(同步方法和同步语句中的代码)。非同步代码不受影响(至少在它遇到同步语句或调用同步方法之前)。
非同步方法 show666()
不会导致线程阻塞。如果将 synchronized(this)
语句更改为 synchronized
方法,则不会发生任何变化 - show666
也不会阻塞(除非它也已同步)。
关于c# - 关于 Java 中的 synchronized 关键字(和 C# 的锁)的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4591914/
在 java 中不使用“同步”关键字的情况下,是否有其他方法可以同步类或方法? 谢谢, 马利卡琼·科卡塔努尔 最佳答案 您可能想查看并发包中引入的对 JDK 5 的更改。 http://java.su
第 1 部分: 假设下面这段代码 void method1(){ synchronized (lockObject){ method2(); System.ou
我有一个 REST 服务器和一个在移动设备上运行的客户端应用程序。客户端有一些数据并希望从服务器获取数据更新。如何以 RESTful 方式在单个事务中执行此操作? 假设客户有以下元素: widge
我有一个多线程 Java 应用程序。在一种方法中,需要同步一个 ArrayList。由于 arrayList 不是线程安全的,所以我必须使用同步。问题是 ArrayList 类型的对象不是对象的成员变
我正在阅读 Android 示例中的 BluetoothChatService.java 文件,有一件事特别让我感到困惑。 方法在多个位置访问静态成员,并且定义为同步。 在另一部分中,正在访问同一个静
我知道为了实现线程安全和同步,我们使用同步块(synchronized block)或方法。 但我无法理解声明- “Java 中的同步块(synchronized block)在某些对象上同步 ” 任
在 Scala 中使用 JDBC 的示例中,有以下代码: this.synchronized { if (!driverLoaded) loadDriver() } 为什么this.synchro
abstract class A { protected abstract int isRunning(); public void concreteMethod() { synchr
有谁可以分享一下他们的经验吗?“我们什么时候在同步方法和同步块(synchronized block)之间进行调用”有任何性能问题吗? 最佳答案 When do we make a call to u
这是我之前问题的后续问题,Is this variable being safely accessed by using synchronization? 对于下面的程序, Class SubClas
我目前正在为 N 体问题实现多线程版本的 Barnes-Hut 算法。虽然该算法有效,但它不是很优化,我正在尝试减少我的程序的运行时间。 我已经确保有多个线程可以准确地找到我正在使用的空间的边界,并意
我有这门课: public class MyClass { public MyClass(){} public void actionA(){ synchronized
又是一个关于ArrayList和synchronize的问题。 我只想知道这段代码到底做了什么: ArrayList list = ....; synchronized (list) { if
我可以在另一个同步块(synchronized block)中包含同步块(synchronized block)以同步另一个对象吗? 例子: synchronized(myObjetc1){
public class ObjectCounter { private static long numOfInstances = 0; public ObjectCounter(){
我在某处读到,对于 various reasons 应该避免 synchronized(this) .然而,我遇到的一些值得尊敬的代码在构造函数中使用了以下内容: public SomeClass(C
Java 为同步代码的关键部分提供了一种非常方便的习惯用法: synchronized(someObject) { // do something really important all b
我有一个 WeakReference 的 Collections.synchronizedList,_components; 我写了类似下面的内容,希望编译者会提示: public boolean a
使用下面两个版本的Singleton Classes有什么区别 首先我使用的是synchronized(Singleton.class) 在第二个我使用同步(Obj)//第一种类型 公共(public
我正在查看 DatagramSocket 的源代码,我发现了这个: public void disconnect() { synchronized (this) { if (i
我是一名优秀的程序员,十分优秀!