首先,synchronized是java中表示同步代码快的关键字,当用来修饰一个方法或者代码块的时候,能保证同一时刻最多只有一个线程在调用该方法。
当对代码块加锁时,synchonized(object)要比直接在方法名前加synchonized关键字效率高一些。
调用sychonized method()的对象会获取该对象中所有synchonized的锁,使得其他线程不能访问所有加了synchonized前缀的方法(不仅仅只是当前运行的方法),影响了其他线程多其他同步方法的访问,降低了效率。而用synchonized 修饰代码块 只会对当前代码块加锁,其他的同步方法不受影响。
下面是一段简单的例子,供大家参考:
public class SyncDemoTest {
private static StringTAG =”SyncDemoTest”;
//等价于方法function2
public synchronized void function1(String b){
Log.e(TAG,”锁方法 1 “+b);
}
public void function2(String b){
synchronized (this) {
Log.e(TAG,”锁方法 2 “+b);
}
}
//等价于方法function4
public synchronized static void function3(String b){
Log.e(TAG,”锁方法 3 “+b);
}
public static void function4(String b) {
synchronized (SyncDemoTest.class) {
Log.e(TAG,”锁方法 4 “+b);
}
}
}