PalDB 线程安全版本-阿里云开发者社区

开发者社区> 晴天哥> 正文

PalDB 线程安全版本

简介: 开篇  本着尊重原创作者精神,我必须表明这个实现是由组内的同事蜂神实现的,我知识站在前人的肩膀上学习了下具体的实现!!!  致敬原作者的牛逼技术!!! PalDB 介绍 PalDB 写数据过程 PalDB 读数据过程 PalDB 线程安全版本 Pa...
+关注继续查看

开篇

 本着尊重原创作者精神,我必须表明这个实现是由组内的同事蜂神实现的,我知识站在前人的肩膀上学习了下具体的实现!!!
 致敬原作者的牛逼技术!!!

PalDB限制

  • PalDB is optimal in replacing the usage of large in-memory data storage but still use memory (off-heap, yet much less) to do its job. Disabling memory mapping and relying on seeks is possible but is not what PalDB has been optimized for.
  • The size of the index is limited to 2GB. There's no limitation in the data size however.PalDB的索引大小不超过2GB
  • PalDB is not thread-safe at the moment so synchronization should be done externally if multi-threaded.PalDB是不线程安全的

PalDB线程安全代码实现

 在java的世界里线程安全的实现方法无非是通过锁或者通过ThreadLocal变量,加锁会对性能有一定的损耗,而ThreadLocal相比之下性能损耗几乎为零,所以在实现上采用的就是ThreadLocal关键字。

代码实现比较

 在实现过程中我们把公用的变量都用ThreadLocal修饰,这样不同的线程读取数据的时候就不会相互干扰,主要变量由:

  • dataInputOutput 读取数据保存的缓冲区
  • storage PalDB读取实现类
  • serialization PalDB自定义实现类的保存变量
//线程不安全版本的ReaderImpl实现类
public final class ReaderImpl implements StoreReader {
  // Configuration
  private final Configuration config;
  // Buffer
  private final DataInputOutput dataInputOutput = new DataInputOutput();
  // Storage
  private final StorageReader storage;
  // Serialization
  private final StorageSerialization serialization;
  // Cache
  private final StorageCache cache;
  // File
  private final File file;
  // Opened?
  private boolean opened;



//线程安全版本的ReaderImpl实现类
public final class ReaderImpl implements StoreReader {
  // Configuration
  private final Configuration config;
  // Buffer
  private final ThreadLocal<DataInputOutput> localDataInputOutput = new ThreadLocal<>();
//  = new DataInputOutput();
  // Storage
  private final ThreadLocal<StorageReader> localStorage = new ThreadLocal<>();
  // Serialization
  private final ThreadLocal<StorageSerialization> localSerialization = new ThreadLocal<>();
  
  private final Map<Thread, StorageReader> allStorageReader = new ConcurrentHashMap<Thread, StorageReader>();

线程不安全版本

 多线程并发读取的时候会因为共同了storage造成读取数据混乱,所以线程安全版本就需要在这几个会造成混乱的变量上做文章。包括:

  • dataInputOutput 读取数据保存的缓冲区
  • storage PalDB读取实现类
  • serialization PalDB自定义实现类的保存变量
public <K> K get(Object key, K defaultValue) {
    checkOpen();
    if (key == null) {
      throw new NullPointerException("The key can't be null");
    }
    K value = cache.get(key);
    if (value == null) {
      try {
        byte[] valueBytes = storage.get(serialization.serializeKey(key));
        if (valueBytes != null) {

          Object v = serialization.deserialize(dataInputOutput.reset(valueBytes));
          cache.put(key, v);
          return (K) v;
        } else {
          return defaultValue;
        }
      } catch (Exception ex) {
        throw new RuntimeException(ex);
      }
    } else if (value == StorageCache.NULL_VALUE) {
      return null;
    }
    return value;
  }

线程安全版本

 每次都从本线程的ThreadLocal变量中获取StorageReader读取数据,然后反序列化到ThreadLocal变量中保存的localDataInputOutput存储序列化的数据。保证了变量线程的安全。

public <K> K get(Object key, K defaultValue) {
    checkOpen();
    if (key == null) {
      throw new NullPointerException("The key can't be null");
    }
    K value = cache.get(key);
    if (value == null) {
      try {
        byte[] valueBytes = localStorage.get().get(localSerialization.get().serializeKey(key));
        if (valueBytes != null) {

          Object v = localSerialization.get().deserialize(localDataInputOutput.get().reset(valueBytes));
          cache.put(key, v);
          return (K) v;
        } else {
          return defaultValue;
        }
      } catch (Exception ex) {
        throw new RuntimeException(ex);
      }
    } else if (value == StorageCache.NULL_VALUE) {
      return null;
    }
    return value;
  }

代码实现核心

 在PalDB的api当中所有的get/put动作都会有checkOpen方法调用,所以在这个方法内部我们把线程不安全的变量都进行了拷贝并保存到ThreadLocal当中,这是整个实现的核心精华!!!感谢原作者牛逼的设计!!!

private void checkOpen() {
    if (!opened) {
      throw new IllegalStateException("The store is closed");
    }
    StorageReader storage = localStorage.get();
    if (null == storage || storage.isClosed()) {
        storage = mainStorage.duplicate();
        localStorage.set(storage);
        allStorageReader.put(Thread.currentThread(), storage);
    } 
    if (null == localDataInputOutput.get()) {
        localDataInputOutput.set(new DataInputOutput());
    }
    if (null == localSerialization.get()) {
        localSerialization.set(new StorageSerialization(this.config));
    }
  }


github仓库

线程安全PalDB github仓库

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
java-多线程 | 线程安全和线程同步
线程安全 线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
1224 0
AnalyticDB 2.4版本发布啦!
AnalyticDB 2.4版本本周发布,很多用户期待的资源大盘功能终于上线。该功能以实例汇总信息和单节点资源信息两个维度向用户展示资源详情和系统性能,很好地协助用户进行数据探查。该版本又新增了DUMP 时支持返回数据总条数功能以及重点优化了MPP下几个函数的兼容性等特性。
2580 0
查看.net frameword版本
原文:查看.net frameword版本  官方答案。 具体步骤如下: 1.打开注册表(Win+R,输入regedit); 2.输入注册表路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP,当前只能查看.net framework 1-4; 3.如果要查看.net framework 4.5往后的版本,输入路径:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full,如果不存在,说明没有安装。
763 0
Servlet中的线程安全
        Servlet 之所有效率比CGI高,是因为CGI每一个请求都会FORK出一个进程来处理相应的请求,而Servlet则是用线程来处理的,但随之而来就有一个问题:多线程的安全问题!       在Servlet中,类的成员变量是共享的,所有的请求都共用成员变量,为了保证线程安全,我们应该尽量做到如下几点:      1.用方法变量,即局部变量来保存请求中的专有数据,因为每个线程都会有自己的一份局部变量,这样就不会相互影响了。
731 0
java中线程安全,线程死锁,线程通信快速入门
java中线程安全,线程死锁,线程通信快速入门一:多线程安全问题 1 引入 复制代码 /* * 多线程并发访问同一个数据资源 * 3个线程,对一个票资源,出售 */ public class ThreadDemo { public static void main(String[] arg...
678 0
低版本的无法打开高版本的VM
低版本VM工具運行高版本VM環境時,會彈出不支持虚拟机配置。例如:使用VM8工具打開VM9配置的VM環境,會彈出下面的提示   在遇到這種情況的時候,一般都會選擇升級VM工具。如果不想升級VM工具,可以通過修改VM環境的配置,使VM環境可以正常的run起來。
613 0
线程安全性
线程安全性 要编写线程安全的代码,其核心在于要对状态访问操作进行管理,特别是对共享的和可变的状态的访问。 "共享"意味着变量可以由多个线程同时访问,而可变则意味着变量的值在其生命周期内可以发生变化。
788 0
ArrayList为什么线程不安全 线程不安全体现在哪些方面 源码角度分析其具体原因
我们都知道ArrayList是线程不安全的,那么它不安全在哪里?又会出现什么并发问题呢?
253 0
+关注
晴天哥
专注java技术,热爱长跑和阅读开源代码
400
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载