什么可以放在同步块内?

时间:2013-02-27 17:01:21

标签: java multithreading synchronized

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

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

        synchronized(args){     
            //do stuff  
        }

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

2 个答案:

答案 0 :(得分:3)

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

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

您可能会因阅读tutorial而受益。

  

什么可以放在Sychronized Block中?

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

  

args是一个实例我是否正确?

args是对String实例的引用(尽管您可能意味着String[])。

  

这个实例也是一个对象?

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

  

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

在块中,您可以按照上面的说明执行您想要的操作。 synchronized关键字(锁)的参数需要是对Object的非null实例的引用。如果你愿意,这可能是一个局部变量(虽然这很可能无法实现你的目标)。

答案 1 :(得分:2)

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

将局部变量放在同步块中没有任何限制 - 通过这样做可以获得很多好处,但它也没有限制。

通过同步本地变量,你不会获得任何有用的东西。