我在想,如果您有一个静态方法 不 同步,但并 没有
修改任何静态变量是线程安全的?如果该方法在其中创建局部变量该怎么办?例如,以下代码是线程安全的吗?
public static String[] makeStringArray( String a, String b ){
return new String[]{ a, b };
}
因此,如果我有两个线程连续且同时调用此方法,一个带狗(例如“大丹狗”和“斗牛犬”),另一个带猫(例如“波斯”和“暹罗”)的猫,我将得到猫和狗在同一阵列中?还是猫和狗永远不会同时处于该方法的同一调用中?
此方法是100%线程安全的,即使不是static
。当您需要在线程之间共享数据时,就会出现线程安全性问题-您必须注意原子性,可见性等。
此方法仅对 驻留在堆栈 上的 参数 以及堆上对不可变对象的引用进行操作。 堆栈本质上是线程本地的 ,因此永远不会发生数据共享。
不可变的对象(String
在这种情况下)也是线程安全的,因为一旦创建,它们就无法更改,并且所有线程都具有相同的值。另一方面,如果该方法正在接受(可变),Date
那么您可能会遇到问题。两个线程可以同时修改同一对象实例,从而导致竞争条件和可见性问题。
问题内容: 我想知道非静态方法如何修改静态变量。我知道静态方法只能访问其他静态方法和静态变量。但是,另一面是真的吗?非静态方法只能访问非静态变量吗?例如: 这段代码可以编译,我想知道为什么要使用静态访问特权。 问题答案: 我已经从The Java Tutorials找到了 实例方法可以直接访问实例变量和实例方法。 实例方法可以直接访问类变量和类方法。 类方法可以直接访问类变量和类方法。 类方法不能
我有点困惑。请看看下面的代码。 我确信调用此序列是可能的。 虽然我仍然有一个小小的困惑,但我们可以很容易地看到也调用方法,这是一个静态方法。方法 是调用非同步静态方法的静态同步方法。当 thread-2 获得类级锁时,为什么从 Thread-1 调用 没有被阻止? 我只是在逻辑上感到困惑,如果一个线程获得类级锁定,则该类其他非同步静态方法保持打开状态,以便从其他方法(实例方法)调用。为什么?
问题内容: 我已经定义了一个对象并声明了一个静态变量。在该方法中,当我尝试打印实例和类变量时,两者都打印相同的值。 不是实例变量吗?它应该打印0而不是50吗? 问题答案: 不,只有一个变量-您尚未声明任何实例变量。 不幸的是,Java允许您访问静态成员,就像通过相关类型的引用访问静态成员一样。这是IMO的设计缺陷,某些IDE(例如Eclipse)允许您将其标记为警告或错误- 但这是语言的一部分。您
问题内容: 任何人都可以解释以下语句吗……“静态同步方法和非静态同步方法不会互相阻塞-它们可以同时运行” 问题答案: 锁定对象在静态方法和非静态方法上有所不同。静态方法将Class对象用作锁(锁obj:),而非静态方法将实例对象用作锁,此时方法的调用已绑定到该对象(锁obj:)。
本文向大家介绍java synchronized同步静态方法和同步非静态方法的异同,包括了java synchronized同步静态方法和同步非静态方法的异同的使用技巧和注意事项,需要的朋友参考一下 java synchronized 详解 synchronized关键字有两种用法,一种是只用于方法的定义中,另外一种是synchronized块,我们不仅可以使用synchronized来同步一个对
我一直在读java中的同步,我有一个问题。我看到的例子是,一个类在一个本地对象上创建一个同步块。或者一个同步的方法。这两个都不适合我的情况。所以我有一个类的静态实例,它保存了整个应用程序的所有数据。该类上的变量被创建为“private”,我创建了getter来检索这些值。其中一些值一次只需要一个线程从应用程序中的不同类访问。由于它们被创建为private,所以我使用同步块,如下所示。。。 我可以通