开始写的代码,其中标识 DailyWorkPut 记录多次出现反复,由于开始数据量少,排查了好久,一直以为是网络请求出现问题。。。。。后来增加测试数据后,用 log 打印才定位到本部分代码,发现这里多次开启同步线程,内部代码访问并修改了 DailyWorkPut ,,,,原来是最低级的错误,同步线程未加锁导致
注:这种问题最恶心,不定时出现错误,而且反复无常没有规律。。。
private void putProjectDailyWork(final String jobId , final String workContent) { new Thread(new Runnable() { @Override public void run() { int code = putDailyWorkMsg(jobId , workContent); if (code == 200) { //请求成功 DailyWorkPut++; if (DailyWorkPutTag == DailyWorkPut) { mHandler.sendEmptyMessageDelayed(3, 800); } } else { //请求失败 mHandler.sendEmptyMessageDelayed(2, 800); } } }).start(); }
修改后:
lock = new ReentrantLock();
private void putProjectDailyWork(final String jobId , final String workContent) { new Thread(new Runnable() { @Override public void run() { //线同步加锁,防止多线程同时访问记录的 DailyWorkPut 数据 //1.获取锁 lock.lock(); try{ Log.i("UPDIALY", "上传信息::"+jobId+"==="+workContent); int code = putDailyWorkMsg(jobId , workContent); if (code == 200) { //请求成功 DailyWorkPut++; Log.i("UPDIALY", "put---daily----work----old:::"+DailyWorkPut); if (DailyWorkPutTag == DailyWorkPut) { Log.i("UPDIALY", "put---daily----work----old:::"+DailyWorkPut+"==="+DailyWorkPutTag); mHandler.sendEmptyMessageDelayed(3, 800); } } else { //请求失败 mHandler.sendEmptyMessageDelayed(2, 800); Log.i("UPDIALY", "put------失败"); } }finally { //2.释放锁 lock.unlock(); } } }).start(); }