假设我们有
class A {
synchronized void m1() {
}
synchronized void m2() {
}
void m3() {
}
static void m6() {
synchronized(this){
}
}
}
和A a1& a2。
类的两个实例现在,如果带有实例a1的线程t1调用方法m1,则仅限制具有实例a1的线程t2不能执行方法m1,直到t1完成m1的执行。并且实例a2的t2可以执行m1()。
现在我的疑问是,执行m1时,带有a1的线程t1可以执行其他方法(m1除外)吗?
b / w同步块和同步方法有什么区别?区别仅在于块具有较小的同步范围,因此效率很高吗?
我读了一篇文章,声明“如果提供给块的表达式作为参数计算为null,则同步块可以抛出java.lang.NullPointerException。”
我们总是使用“this”作为同步块的参数,因此在静态方法中只有并且总是使用synchronized块的情况。因此我们不需要对象实例来执行静态方法。
我在哪里误解了它?
答案 0 :(得分:4)
现在,如果带有实例a1的线程t1调用方法m1,则只有 限制实例a1的线程t2不能执行方法m1 直到t1完成m1的执行。和实例a2的t2可以 执行m1()。
这是对的。由于两个线程在同一个实例上都是synchronized
,因此第一个Thread
可以执行,第二个Thread
可以等待。
现在我的疑问是,带有a1的线程t1可以执行其他操作 在执行m1时,方法(m1除外)是否平行?
是的,这称为可重入同步。看看end of this tutorial.
b / w同步块和同步方法有什么区别?是 区别仅在于块的范围较小 同步所以效率很高?
synchronized
块可用于任何实例。 synchronized
方法隐式地在this
上同步。尽可能经常在实际的关键部分周围使用synchronized
块。
我搜索了一篇文章,声称“同步块可以抛出 java.lang.NullPointerException如果将表达式提供给块为 参数计算为null“。
以下
synchronized(null) {...}
会抛出NullPointerException
。
答案 1 :(得分:0)
例如,synchronized(this){...}将仅在实际临界区周围运行,并且仅在当前实例上运行但是synchronized(otherInstance){...}将与其他实例一起独立于当前实例
答案 2 :(得分:0)
我想是的。
关于对此进行同步,如果您对“this”或某个特定类的内部(甚至外部)逻辑的任何公开可见对象进行同步,您将面临类外的某些内容可能“干扰”的风险坚持锁定的东西。因此......无论何时决定特定案例的锁定机制,您都需要权衡一下并在API中明确该对象的锁定策略是什么。