我知道可以将一块代码或实例放入同步块中。所以请考虑这个简短的例子:
public class SynchronizedObject {
public static void main(String args){
System.out.println(" 1 " );
synchronized(args){
//do stuff
}
在这种情况下,args是一个实例我是否正确?而这个实例也是一个对象?在任何情况下都不能将变量或局部变量放入同步块中吗?
答案 0 :(得分:3)
你的问题不清楚。你似乎混合了块和语句:
//do stuff
部分。args
是synchronized
语句使用的锁。您可能会因阅读tutorial而受益。
什么可以放在Sychronized Block中?
任何你想要的东西,只要它是有效的java语句。
args是一个实例我是否正确?
args是对String
实例的引用(尽管您可能意味着String[]
)。
这个实例也是一个对象?
嗯,是的,类的实例是一个对象。
在任何情况下都不能将变量或局部变量放入同步块中吗?
在块中,您可以按照上面的说明执行您想要的操作。 synchronized
关键字(锁)的参数需要是对Object的非null实例的引用。如果你愿意,这可能是一个局部变量(虽然这很可能无法实现你的目标)。
答案 1 :(得分:2)
在这种情况下,args
是一个局部变量 - 它是String
类的一个实例。 String
确实是Object
,因为Java中的所有类都派生自Object
将局部变量放在同步块中没有任何限制 - 通过这样做可以获得很多好处,但它也没有限制。
通过同步本地变量,你不会获得任何有用的东西。