Jav*_*ser 5 java multithreading synchronized thread-safety
我在类中有多个方法,大多数方法都有关键部分(共享数据).所以我把这些方法做成了同步.假设线程t1正在运行其中一个同步块.同时线程t2可以访问其他方法的关键部分吗?
class Sample{
synchronized public void method1(){
}
synchronized public void method2(){
}
synchronized public void method3(){
}
public void method4(){
}
}
Run Code Online (Sandbox Code Playgroud)
synchronized始终锁定在对象上.在同步方法的情况下,对象是this.所以基本上这两种方法都是一样的:
synchronized public void method1() {
// do something
}
Run Code Online (Sandbox Code Playgroud)
和
public void method1() {
synchronized(this){
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
只要一个线程锁定锁定对象,就没有其他线程可以锁定此对象.因此,在您的示例中,同步方法(一,二和三)永远不能同时执行.method4不同步,因此它可以随时访问该对象.
如果你想要一个更精细的锁定,因为method1并且method2应该是独占的,method3并且method4你可以使用例如这样的东西:
class Sample{
private final Object lock1 = new Object();
private final Object lock2 = new Object();
public void method1(){
synchronized(lock1) {
// do something
}
}
public void method2(){
synchronized(lock1) {
// do something
}
}
public void method3(){
synchronized(lock2) {
// do something
}
}
public void method4(){
synchronized(lock2) {
// do something
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您甚至可以使用该synchonized(lock)方法来包装需要同步的语句,而不是整个方法:
public void method() {
// some code
synchronized(lock) {
// code that must be synchronized
}
// some other code
}
Run Code Online (Sandbox Code Playgroud)
使用这种方法,您可以将锁定持续时间降至最低.
对同一对象的同步方法的两次调用不可能交错。当一个线程正在执行对象的同步方法时,调用同一对象的同步方法的所有其他线程都会阻塞(挂起执行),直到第一个线程完成该对象。
当同步方法退出时,它会自动与同一对象的同步方法的任何后续调用建立发生之前关系。这保证了对象状态的更改对所有线程都可见
| 归档时间: |
|
| 查看次数: |
1504 次 |
| 最近记录: |