0

我知道可以将一段代码或实例放入同步块中。所以考虑这个简短的例子:

public class SynchronizedObject {   
    public static void main(String args){
        System.out.println(" 1 " );

        synchronized(args){     
            //do stuff  
        }

在这种情况下, args 是一个实例,我正确吗?而这个实例也是一个对象?在任何情况下都不能将变量或局部变量放入同步块中?

4

2 回答 2

3

你的问题不清楚。您似乎混合了块和语句:

  • 在您的示例中,同步块是花括号内的任何内容,因此是//do stuff部分。
  • args,在您的示例中,是synchronized语句使用的锁。

您可能会从阅读教程中受益。

什么可以放在同步块中?

只要是有效的 java 语句,你想要的任何东西。

args 是一个实例,我正确吗?

Stringargs 是对(尽管您可能是指String[])的一个实例的引用。

这个实例也是一个对象?

嗯,是的,一个类的实例就是一个对象。

在任何情况下都不能将变量或局部变量放入同步块中?

在块内,您可以按照上面的说明做您想做的事情。关键字(锁)的参数synchronized需要是对 Object 的非空实例的引用。如果您愿意,这可能是一个局部变量(尽管这很可能无法实现您的目标)。

于 2013-02-27T17:05:51.077 回答
2

在这种情况下args是一个局部变量 - 它是一个String类的实例。并且String确实是一个Object,因为 Java 中的所有类都派生自Object

将局部变量放在同步块中没有任何限制 - 这样做没有什么好处,但也没有限制。

但是,通过在局部变量上同步,您不会获得任何有用的信息。

于 2013-02-27T17:08:48.250 回答