【问题标题】:What can be put inside a Synchronized Block?什么可以放在同步块中?
【发布时间】:2013-02-13 14:27:17
【问题描述】:

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

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

        synchronized(args){     
            //do stuff  
        }

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

【问题讨论】:

    标签: java multithreading synchronized


    【解决方案1】:

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

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

    您可能会从阅读tutorial 中受益。

    什么可以放在同步块中?

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

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

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

    这个实例也是一个对象?

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-21
        • 2019-02-26
        • 1970-01-01
        相关资源
        最近更新 更多