在Java中同步静态方法和非静态方法有什么区别?有人可以举例说明吗?在同步方法和同步代码块方面也有什么区别吗?
我将尝试添加示例以使这一点更加清楚。
如前所述,Java中的同步是Monitor概念的实现。当您将代码块标记为同步时,可以使用一个对象作为参数。当执行线程进入这样的代码块时,它必须首先等待,直到同一对象上的同步块中没有其他执行线程。
Object a = new Object();
Object b = new Object();
...
synchronized(a){
doStuff();
}
...
synchronized(b){
doSomeStuff();
}
...
synchronized(a){
doOtherStuff();
}
在上面的示例中,一个正在运行的线程doOtherStuff()
将阻止另一个线程进入代码保护模块doStuff()
。但是,线程可以进入该块doSomeStuff()
而不会出现问题,因为同步于Object b
,而不是Object a
。
在实例方法(非静态方法)上使用synced修饰符时,它与使用“
this”作为参数的同步块非常相似。因此,在以下示例中,methodA()
和methodB()
将以相同的方式起作用:
public synchronized void methodA() {
doStuff();
}
...
public void methodB() {
synchronized(this) {
doStuff();
}
}
请注意,如果methodC()
该类中有一个不同步且没有同步块的类,则什么也不会阻止线程进入该方法,并且粗心的编程可能会使该线程访问对象中的非安全代码。
如果您有一个带有synced修饰符的静态方法,则实际上与使用synced块ClassName.class
作为参数是一样的(如果您拥有该类的对象ClassName cn = new ClassName();
,则可以使用来访问该对象Class c = cn.getClass();
)
class ClassName {
public void static synchronized staticMethodA() {
doStaticStuff();
}
public static void staticMethodB() {
synchronized(ClassName.class) {
doStaticStuff();
}
}
public void nonStaticMethodC() {
synchronized(this.getClass()) {
doStuff();
}
}
public static void unSafeStaticMethodD() {
doStaticStuff();
}
}
所以在上面的例子中,staticMethodA()
并staticMethodB()
采取同样的方式。当执行线程nonStaticMethodC()
正在同一对象上同步时,执行线程也将被阻止访问该代码块。
但是,重要的是要知道,没有什么会阻止正在执行的线程进行访问unSafeStaticMethodD()
。即使我们说一个静态方法“在Class对象上同步”,也不意味着它同步了对该类中方法的所有访问。它只是意味着它使用Class对象进行同步。仍然可以进行非安全访问。
我有点困惑。请看看下面的代码。 我确信调用此序列是可能的。 虽然我仍然有一个小小的困惑,但我们可以很容易地看到也调用方法,这是一个静态方法。方法 是调用非同步静态方法的静态同步方法。当 thread-2 获得类级锁时,为什么从 Thread-1 调用 没有被阻止? 我只是在逻辑上感到困惑,如果一个线程获得类级锁定,则该类其他非同步静态方法保持打开状态,以便从其他方法(实例方法)调用。为什么?
本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对
问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。
我正在编写的代码需要在几个静态方法之间进行一些同步。我的目标是阻止执行这些方法中的任何一个,如果其中一个执行。例如: 现在让我们假设下面的代码是从代码中的某个地方执行的: 我的问题是: > 它实际上是同步的吗?methodA和methodB不会同时运行吗? 如果是,methodA调用methodB会不会造成死锁?
问题内容: 请参见下面的代码段: 代码1 代码2 这些代码段之间有什么区别?两者都15作为答案输出。 问题答案: 静态方法属于类本身,而非静态(aka实例)方法属于从该类生成的每个对象。如果你的方法执行的操作不依赖于其类的单个特征,请将其设置为静态(这将使程序的占用空间减小)。否则,它应该是非静态的。 例: 你可以像这样调用静态方法:。如果你使用method2尝试该操作,它将失败。但这将起作用:;
本文向大家介绍浅析C#中静态方法和非静态方法的区别,包括了浅析C#中静态方法和非静态方法的区别的使用技巧和注意事项,需要的朋友参考一下 静态方法和非静态方法的区别: 1.静态方法不需要类实例化就可以调用,反之非静态方法需要实例化后才能调用; 2.静态方法只能访问静态成员和方法,非静态方法都可以访问; 3.静态方法不能标记为override,导致派生类不能重写,但是可以访问; 4.静