Tag: 线程局部

为什么Java的语言设计者更倾向于对大多数基于散列的结构的开放寻址进行链接,除了像ThreadLocal这样的结构?

我知道Open Addressing和Chaining之间在解决哈希冲突方面的区别。 大多数基于哈希的基本哈希数据结构如Java中的HashSet , HashMap主要使用链接技术。 我读到ThreadLocal实际上使用了探测方案。 所以我想理解为什么开放式寻址在Java中没有那么多用? 我的意思是,使用该方案删除记录很困难,因为您必须使用一些特殊处理来标记这些单元格。 然而,对于开放寻址方案,似乎存储器要求将是低的。 编辑 :我只是想了解这个设计决定的可能主要原因/原因。 我不想要更精细的细节。 此外,我想知道为什么ThreadLocal使用较少见的开放寻址技术。 我想这两个答案可以联系在一起。 所以我更喜欢在同一个问题中提问。

ThreadLocal HashMap vs ConcurrentHashMap用于线程安全的未绑定缓存

我正在创建一个具有以下特征的memoization缓存: 高速缓存未命中将导致计算和存储条目 这个计算非常昂贵 这种计算是幂等的 无界限(条目从未删除)因为: 输入将导致最多500个条目 每个存储的条目都很小 缓存相对短缺(通常不到一小时) 总的来说,内存使用不是问题 将有成千上万的读取 – 在缓存的生命周期中,我预计99.9%+缓存命中 必须是线程安全的 什么会有一个优越的性能,或在什么条件下一个解决方案优于另一个解决方案? ThreadLocal HashMap: class MyCache { private static class LocalMyCache { final Map map = new HashMap(); V get(K key) { V val = map.get(key); if (val == null) { val = computeVal(key); map.put(key, val); } return val; } } private final […]

servlet中的threadlocal变量

threadlocals变量是否对拥有变量的servlet的所有请求都是全局的? 我在服务器上使用树脂。 谢谢awnser。 我想我可以让自己更清楚。 具体案例: 我要: 请求开始执行时初始化静态变量。 能够以线程安全的方式在从servlet调用的方法的进一步执行中查询变量的值,直到请求结束执行

预初始化工作线程池以重用连接对象(套接字)

我需要在Java中构建一个工作池,每个工作者都有自己的连接套接字; 当工作线程运行时,它使用套接字但保持打开状态以便以后重用。 我们决定使用这种方法,因为与临时创建,连接和销毁套接字相关的开销需要太多的开销,因此我们需要一种方法,通过这种方法,工作池预先初始化其套接字连接,准备好承担工作同时保持套接字资源免受其他线程的影响(套接字不是线程安全的),所以我们需要沿着这些方向做点什么…… public class SocketTask implements Runnable { Socket socket; public SocketTask(){ //create + connect socket here } public void run(){ //use socket here } } 在应用程序启动时,我们想要初始化工作程序,并希望套接字连接也能以某种方式… MyWorkerPool pool = new MyWorkerPool(); for( int i = 0; i < 100; i++) pool.addWorker( new WorkerThread()); 当应用程序请求工作时,我们将任务发送到工作池以立即执行… pool.queueWork( new SocketTask(..)); 更新了工作代码 基于Gray和jontejj的有用评论,我得到以下代码… SocketTask public class SocketTask […]