多线程运行同步锁synchronize的一些实战心得

来源:互联网 发布:淘宝商品批量上传 编辑:程序博客网 时间:2024/05/21 08:51

同步锁的应用本质:牺牲程序执行性能而换取数据的安全变动。

原则:如果在实际开发中,在使用同步锁之前,必须先了解你要调用的同步对象,内部是否已经实现了同步,如果实现了同步,则无需加锁,否则就要加锁。

1.内部方法已经实现同步,无需加锁的例子:

Message message = Message.obtain(handler);@Overridepublic void run(){  handler.sendMessage(message);}

在Android开发中,因为Message类的obtain方法和Handler类的sendMessage方法,通过跟踪内部源代码,发现其最终都是实现了同步锁synchronize,这样就可以直接在多线程运行的run方法中使用,而无需再加同步锁减低性能。


2.内部方法未实现或者未知是否实现同步,必须加锁的例子:

int count = 0;SmsManager smsManager = msManager.getDefault();@Overridepublic void run(){  synchronized (smsManager) {   for (int i = 0;i<= 10;i++);   {     smsManager.sendTextMessage("电话号码",null,count++,null,null;    }  }}

对于数据的变换的代码块中必须加锁,即是count++的运算,而且锁的同步对象为调用方法的主体smsManager。

提醒:在实际开发如果不确定是否加锁操作,参考以上原则使用,基本上可以满足大部分要求,如果出现特殊情况,必须要进行再修正。

0 0