Blankj / Blankj/AndroidUtilCode

CacheDiskStaticUtils多线程存储的时候有问题

Aperta
#1,479 0 commenti 0 reazioni 1 assegnatario Rivendicata da @Blankj Vedi su GitHub
bug
Lingua principale
Java
Stelle
33.6k
Fork
10.6k
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Descrizione

多个线程调用CacheDiskStaticUtils.put()存储数据的时候,文件写入有问题。排查发现UtilsBridge.writeFileFromBytes(file, value)是非线程安全的,大佬麻烦看一下

- AndroidUtilCode 的版本:utilcode:1.30.0
- 出现 Bug 的设备型号:MeiZu M6Note
- 设备的 Android 版本:API 25

## 问题代码
```
CacheDiskUtils.class
private void realPutBytes(final String key, byte[] value, int saveTime) {
if (value == null) return;
DiskCacheManager diskCacheManager = getDiskCacheManager();
if (diskCacheManager == null) return;
if (saveTime >= 0) value = DiskCacheHelper.newByteArrayWithTime(saveTime, value);
File file = diskCacheManager.getFileBeforePut(key);
UtilsBridge.writeFileFromBytes(file, value);
diskCacheManager.updateModify(file);
diskCacheManager.put(file);
}
```

## 测试代码
```
private int num = 0;
private Runnable mRunnable = () -> {
num++;
CacheDiskStaticUtils.put("save_test", num + "");
};

private void testSave() {
try {
Thread thread1 = new Thread(mRunnable);
Thread thread2 = new Thread(mRunnable);
Thread thread3 = new Thread(mRunnable);
Thread thread4 = new Thread(mRunnable);
Thread thread5 = new Thread(mRunnable);
Thread thread6 = new Thread(mRunnable);

thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
thread6.start();

thread1.join();
thread2.join();
thread3.join();
thread4.join();
thread5.join();
thread6.join();
} catch (Exception e) {
e.printStackTrace();
}
LogUtils.e("value:" + CacheDiskStaticUtils.getString("save_test") + " num:" + num);
}
```

## 截图
[
![jt1](https://user-images.githubusercontent.com/38761029/113822080-916f6600-97af-11eb-9b3a-2b221f736d37.png)
](url)

Guida per i contributori

Nessuna guida per i contributori indicizzata per questo repository

Valutazione

Questa issue non è ancora stata valutata.

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.