1)如果一个班级(比如说TestClass
)有两种方法(method1
,method2
)。两个线程(t1
,t2
)平行运行,t1
正在调用对象method1
(类型object1
)的TestClass
,并且t2
正在调用同一对象method2
的{{1}}。
object1
同步,而method1
不同步,会怎样?在下面,同一个对象的method2
和method1
可以与两个线程并行执行?
method2
带有.class void method1() {
synchronized(object1) {
....
}
}
void method2() {
synchronized(object1) {
....
}
}
答案 0 :(得分:1)
如果只有method1是synchronized
,那么method2和method1可以并行执行。
如果两种方法都标记为synchronized
,则它们无法并行运行。
我认为这里让您感到困惑的是synchronized
关键字。将为该类实例同步synchronized方法。像这样:
synchronized void Method1(){}
synchronized void Method2(){}
只有在未定义的实例未用于在其他位置执行同步代码块时,才能输入这些方法。与此相比:
void Method1(){
//can run in parallel
synchronized(this){
//cannot run in parallel.
}
//can run in parallel.
}
void Method2(){
synchronized(this){
//cannot run in parallel.
}
}
这不完全一样。可以输入两种方法 ,但同步块中的代码不能并行运行。
最后,如果您在TestClass.class
上进行同步,则会阻止代码在同一对象上同步执行。在同步任何静态对象时都是如此。
答案 1 :(得分:0)
答案 2 :(得分:0)
只要方法不改变共同范围内的/ any对象的状态,就不需要同步。有趣的部分在....
。