多线程运行同步锁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。 

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值