Blankj / Blankj/AndroidUtilCode

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

Abierto
#1,479 0 comentarios 0 reacciones 1 asignado Reclamado por @Blankj Ver en GitHub
bug
Lenguaje dominante
Java
Estrellas
33.6k
Forks
10.6k
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

多个线程调用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)

Guía de contribución

No hay ninguna guía de contribución indexada para este repositorio

Evaluación

Este issue todavía no se ha evaluado.

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.