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

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

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

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。 
  

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

你可能感兴趣的:(Java,Android)