【问题标题】: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
将局部变量放在同步块中没有任何限制 - 这样做没有什么好处,但也没有限制。
但是,通过在局部变量上进行同步,您不会获得任何有用的信息。