【发布时间】:2013-10-14 06:38:56
【问题描述】:
假设我们有
class A {
synchronized void m1() {
}
synchronized void m2() {
}
void m3() {
}
static void m6() {
synchronized(this){
}
}
}
以及 A 类 a1&a2 的两个实例。
现在如果线程 t1 和实例 a1 调用方法 m1,只有在 t1 完成 m1 的执行之前,线程 t2 和实例 a1 不能执行方法 m1。并且 t2 与实例 a2 可以执行 m1()。
现在我的疑问是线程 t1 与 a1 可以在执行 m1 时并行执行其他方法(m1 除外)吗?
黑白同步块和同步方法有什么区别?只是区块的同步范围更小,所以效率更高?
我读过一篇文章,说明“如果作为参数提供给块的表达式计算为 null,则同步块可以抛出 java.lang.NullPointerException”。
我们总是使用“this”作为同步块的参数,所以只有并且总是在静态方法中使用同步块。因为我们不需要对象实例来执行静态方法。
我在哪里误解了它?
【问题讨论】:
-
we always use "this" as parameter to synchronized block。实际上在this上同步被认为是不好的做法 -
we always use "this" as parameter to synchronized block现在这是一个错误...... -
@ppeterka66 您能否解释一下我们应该使用什么样的表达式作为同步块的参数,因为我可以看到 Sotirios Delimanolis 的答案直接将 null 作为参数。你能举个例子来说明清楚吗?请
-
@ppeterka66 虽然
synchronized(this)可能是个坏习惯。只有当引用的this可以公开访问时,才会如此。否则委派孩子synchronized(this)完全没问题。 -
@JohnVint 同步时你是否使用
this总是?
标签: java multithreading synchronization