同步锁的应用本质:牺牲程序执行性能而换取数据的安全变动。
原则:如果在实际开发中,在使用同步锁之前,必须先了解你要调用的同步对象,内部是否已经实现了同步,如果实现了同步,则无需加锁,否则就要加锁。
1.内部方法已经实现同步,无需加锁的例子:
Message message = Message.obtain(handler);
@Override
public void run()
{
handler.sendMessage(message);
}
在Android开发中,因为Message类的obtain方法和Handler 类的sendMessage方法,通过跟踪内部源代码,发现其最终都是实现了同步锁synchronize,这样就可以直接在多线程运行的run方法中使用,而无需再加同步锁减低性能。
2.内部方法未实现或者未知是否实现同步,必须加锁的例子:
int count = 0;
SmsManager smsManager = msManager.getDefault();
@Override
public void run()
{
synchronized (smsManager)
{
for (int i = 0;i<= 10;i++);
{
smsManager.sendTextMessage("电话号码",null,count++,null,null;
}
}
}
对于数据的变换的代码块中必须加锁,即是count++的运算,而且锁的同步对象为调用方法的主体smsManager。
提醒:在实际开发如果不确定是否加锁操作,参考以上原则使用,基本上可以满足大部分要求,如果出现特殊情况,必须要进行再修正。