java中的synchronized,平时写程序的时候很少用到。今天碰到了,就查了查资料做个总结:
JAVA的synchronized关键字能够作为函数的修饰符,也可作为函数内语句的修饰符,也就是平时说的同步方法和同步语句块。
需要明确以下几点:
A.无论synchronized关键字加在方法上还是对象上,他取得的锁都是对象,而不是把一段代码或函数当作锁――而且同步方法很可能还会被其他线程的对象访问。
B.每个对象只有一个锁(lock)和之相关联。
C.实现同步是要很大的系统开销作为代价的,甚至可能造成死锁,所以尽量避免无谓的同步控制。
一、当作函数修饰符代码示例:
public void method() {
synchronized (this){
//…..
}
}
说明:synchrnized锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,他们之间会形成互
斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了synchronized关键字的方法。
二、当语句块修饰符示例:
//当没有明确的对象作为锁的时候
class Foo implements Runnable {
private byte[] lock = new byte[0]; // 特别的instance变量
Public void method() {
synchronized(lock) {
//…
}
}
//…..
}
说明:锁就是so这个对象,谁拿到这个锁谁就能够运行他所控制的那段代码。当有一个明确的对象作为锁时,就能够这样写程式,但当没有
明确的对象作为锁,只是想让一段代码同步时,能够创建一个特别的instance变量(他得是个对象)来充当锁。