我想知道你是否有一个静态方法是不是同步的,但是不是修改任何静态变量,它是线程安全的吗?如果该方法在其内部创建局部变量怎么办?例如,下面的代码是线程安全的吗?
public static String[] makeStringArray( String a, String b ){
return new String[]{ a, b };
}
因此,如果我有两个线程连续且并发地调用这个方法,一个线程调用狗(比如"great dane“和"bull”),另一个线程调用猫(比如"persian“和"siamese"),我会得到猫和狗在同一个数组中吗?或者猫和狗永远不会同时在同一个方法调用中?
发布于 2011-03-03 05:01:37
这个方法是100%线程安全的,即使它不是static
。当你需要在线程之间共享数据时,线程安全的问题就出现了--你必须注意原子性、可见性等。
此方法仅对驻留在堆栈上的参数和对堆上不可变对象的引用进行操作。堆栈本质上是线程的本地堆栈,因此永远不会发生数据共享。
不可变对象(在本例中为String
)也是线程安全的,因为一旦创建,它们就不能更改,并且所有线程都看到相同的值。另一方面,如果该方法接受(可变的) Date
,那么您可能会遇到问题。两个线程可以同时修改同一个对象实例,从而导致争用条件和可见性问题。
发布于 2011-03-03 05:02:56
当一个方法改变一些共享状态时,它只能是线程不安全的。它是否是静态的是无关紧要的。
发布于 2011-03-03 05:08:36
该函数是完全线程安全的。
如果你仔细想想..。假设如果这种情况不同,会发生什么。如果不同步,每个常用函数都会有线程问题,因此JDK中的所有API函数都必须同步,因为它们可能会被多个线程调用。由于大多数时候应用程序都在使用一些API,因此多线程应用程序实际上是不可能的。
这太荒谬了,不去想它,所以只对你来说:如果有一个明确的原因可能会出现问题,那么方法就不是threadsafe。试着总是想一想,如果我的函数中有多个线程,如果你有一个步骤调试器,会不会一步接着一步地推进第一步……然后第二个线程...也许是第二次...会有问题吗?如果你找到了一个,它就不是线程安全的。
还请注意,大多数Java1.5集合类都不是线程安全的,除了那些声明的类,比如ConcurrentHashMap。
如果您真的想深入研究这个问题,可以仔细研究一下volatile关键字及其所有副作用。请看一下信号量()和锁()类,以及它们在java.util.Concurrent中的朋友。阅读类周围的所有API文档。这也是值得学习和满足的。
对于这个过于复杂的回答,我很抱歉。
https://stackoverflow.com/questions/5173399
复制相似问题