-
实例范围。
实例范围同步方法
publicd class syncTest {
…
synchronized void aMethod() {
//需要同步使用的代码
}
} |
实例范围同步区块
publicd class syncTest {
…
void aMethod() {
//无需同步使用的代码
…
synchronized(this) {
//需要同步使用的代码块
}
}
} |
-
类范围
类范围同步方法
publicd class syncTest {
…
synchronized static void aMethod() {
//需要在类范围同步使用的代码
}
} |
类范围同步区块
publicd class syncTest {
…
static void aMethod() {
…
//无需同步使用的代码
synchronized (syncTest.class) {
//需要在类范围同步使用的代码
}
}
} |
-
注意事项
synchronized关键字是不能继承的
关于加锁
-
无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问;
-
每个对象只有一个锁(lock)与之相关联;
-
实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
对共享资源的同步访问更加安全的技巧
-
定义private 的instance变量+它的 get方法,而不要定义public/protected的instance变量。如果将变量定义为public,对象在外界可以绕过同步方法的控制而直接取得它,并改动它;