这两种形式都是为了程序的安全。
1,synchronized加在方法上
例如:
public synchronized void run();
每个 synchronized 方法都必须获得调用run方法的锁方能执行,否则线程阻塞,方法一旦执行,其他线程就不允许在进入,直到从该方法返回时才将锁释放。
优点:这种机制确保了同一时刻, synchronized 的成员函数中只能有只有一个处于可执行状态,从而有效避免了类成员变量的访问冲突。
缺点:如果方法中执行的内容很多,就会影响到效率。因为在线程的整个生命期内它一直在运行,所以它对本类任何 synchronized 方法的都不能调用。
2,synchronize块
例如:
synchronized(Object) {
//代码
}
1,因为synchronize加在方法上会可能会导致效率问题,所以出现了代码块。(要声明是哪个对象的锁)
优点:它可以针对任意代码块,而且可任意指定锁的对象,所以灵活性较高。
缺点:如果方法中代码很多时,用代码块显得会很臃肿,程序没有阅读性
|