java synchronized,
分享于 点击 11782 次 点评:61
java synchronized,
同步类型
1 同步代码块
synchronized(obj)
{
}
obj是一个对象的实例
一个线程A执行这个代码块时,其他线程(B,C,D)遇到被obj同步的代码块就阻塞,等待A解除占用后再执行,A可以在同步代码块中调用被obj同步的其他代码块内容。
2 同步函数
public synchronized void action()
{
}
方法同步时,同步锁对象是调用这个方法的对象
3 同步静态函数
4 同步类
Class Foo
{
public synchronized static void methodA()
{
}
public void methodBBB()
{
synchronized(Foo.class) // class literal(类名称字面常量)
}
}
代码中的methodBBB()方法是把class literal作为锁的情况,它和同步的static函数产生的效果是一样的,取得的锁很特别,是当前调用这个方法的对象所属的类(Class,而不再是由这个Class产生的某个具体对象了)。
特殊注意
1 无论synchronized关键字加在方法上还是对象上,它取得的锁都是对象
2 每个对象只有一个锁与之相关联。
3 实现同步要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
4 但当没有明确的对象作为锁,只是想让一段代码同步时,可以创建一个特殊的instance变量(它得是一个对象)来充当锁:
class Foo implements Runnable
{
private byte[] lock = new byte[0]; // 特殊的instance变量
Public void methodA()
{
synchronized(lock) {
}
}
}
注:零长度的byte数组对象创建起来将比任何对象都经济――查看编译后的字节码:生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码。
相关文章
- 暂无相关文章
用户点评