提到线程安全,大家都想到用synchonized关键字,其实还有另一种方法,就是ThreadLocal,它通过为每个线程提供一个独立的变量副本解决了变量并发访问的冲突问题。在很多情况下,ThreadLocal比直接使用synchronized同步机制解决线程安全问题更简单,更方便,且结果程序拥有更高的并发性。
下面来看一个hibernate中典型的ThreadLocal的应用:
1.private static final ThreadLocal threadSession = new ThreadLocal();
2.
3.public static Session getSession() throws InfrastructureException {
4. Session s = (Session) threadSession.get();
5. try {
6. if (s == null) {
7. s = getSessionFactory().openSession();
8. threadSession.set(s);
9. }
10. } catch (HibernateException ex) {
11. throw new InfrastructureException(ex);
12. }
13. return s;
14.}
可以看到在getSession()方法中,首先判断当前线程中有没有放进去session,如果还没有,那么通过sessionFactory().openSession()来创建一个session,再将session set到线程中,实际是放到当前线程的ThreadLocalMap这个map中,这时,对于这个session的唯一引用就是当前线程中的那个ThreadLocalMap,而threadSession作为这个值的key,要取得这个session可以通过threadSession.get()来得到,里面执行的操作实际是先取得当前线程中的ThreadLocalMap,然后将threadSession作为key将对应的值取出
分享到:
相关推荐
非线程安全类的例子可以是 NotThreadSafe 类,该类有一个共享变量 state,当多个线程使用同一个 NotThreadSafe 类的一个对象时,也会共享该对象的 state 属性,故是非线程安全的。 但是,通过一些改造也可以将非...
在实现线程安全的循环单链表时,还需要考虑以下几点: 1. **迭代器**:为了支持遍历链表,可以实现`Iterable`接口并提供一个线程安全的迭代器。迭代器的`hasNext()`和`next()`方法也需要使用`synchronized`关键字。 ...
`synchronized`关键字是Java中用于实现线程同步的关键机制,它确保同一时间只有一个线程可以执行特定的代码块或方法。当一个方法或代码块被`synchronized`修饰时,它会获取一个锁(也称为监视器锁),在该锁释放之前...
- **Join方法**:允许一个线程等待另一个线程完成其工作,从而实现线程间的协作。 - **中断线程**:通过调用`interrupt()`方法可以请求线程停止执行,但实际停止需要线程内部配合检查`isInterrupted()`或捕获`...
在C#中,实现线程安全通常有几种策略:锁(Lock)、Monitor、Mutex、Semaphore以及线程局部存储(ThreadLocal)等。 这个压缩包中的"TestConsoleApp"很可能是一个演示程序,展示了如何使用封装好的线程安全日志类。在...
由于具体测试代码未给出,这部分无法提供详细的实现,但以上给出了一个实现线程安全队列和进行测试的基本框架。 通过这样的实现和测试,我们可以确保在多线程环境中,C++的线程安全队列能够正确地工作,避免了数据...
下面是一个简单的线程安全的txt日志类实现: ```csharp using System; using System.IO; public class ThreadSafeLogFile { private readonly object _logLock = new object(); private string _filePath; ...
在C++编程中,单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供一个全局访问点。线程安全的单例模式在多线程环境下尤其重要,因为不正确的实现可能导致多个线程创建多个实例,这违反了单例模式...
在使用线程时,最麻烦的就是线程的同步控制,如... 本人经过试验和总结,整理出可以安全的进行暂停、继续、停止线程执行的一个线程类,能非常方便的对线程进行控制。 附件里是源码和Sample程序,并有详细的使用说明。
总的来说,这个压缩包提供了一个用于VB6的多线程ActiveX组件,包括了实现多线程安全操作的关键库(MT32.dll)、一个演示示例(Demo.exe和frmMain.frm)以及相关的文档(MT32.rtf)。对于那些在VB6环境下开发多线程...
在LabWindows/CVI中,实现线程安全变量可能需要使用特定的线程库函数,如`cvAtomicInc()` 和 `cvAtomicDec()`,它们提供原子性地增加或减少变量的值。此外,还可以使用`cvMutexVar`结构体来创建自定义的线程安全变量...
2. 使用线程安全的集合:.NET框架提供了线程安全的集合类,如ConcurrentBag、ConcurrentQueue和ConcurrentStack等,它们在内部实现了线程同步,可以安全地在多线程环境下使用。 3. 避免在多线程环境中直接修改List...
通常,我们会创建一个类模块(Class Module),然后在这个类模块中定义线程函数,如`Public Sub ThreadFunction()`,并在其中实现需要并发执行的任务。 4. 调用线程 在主应用程序中,可以通过创建ActiveX EXE的...
- 这个文件可能包含了使用QMutex的实例代码,可能包括一个自定义的线程类,其中使用了QMutex来保护共享数据。分析这个代码可以帮助理解如何在实际项目中应用上述理论知识。 综上,理解并熟练运用QThread、QMutex和...
在Java编程中,HashMap是一个非常常用的集合类,用于存储键值对数据。然而,它存在一个重要的特性,那就是线程不安全。理解这个问题并找到解决方案是每个Java开发者必须掌握的知识。 HashMap线程不安全的原因主要...
3. 条件线程安全:除了某些方法需要在没有其它线程的干扰的情况下顺次执行之外,条件线程安全类和线程安全类类似。为了消除线程干扰的可能性,客户端对象在调用这类方法的过程中需要获得该集合类对象的锁来进行同步...
Java线程安全是多线程编程中的一个关键概念,它涉及到多个线程访问共享资源时可能出现的问题。在Java中,线程安全问题通常与并发、内存模型和可见性有关。Java内存模型(JMM)定义了如何在多线程环境下共享数据的...
内部类,也称为嵌套类,是在一个类的内部定义的另一个类。它们可以是静态或非静态的,每种类型都有其特定的用途。当我们谈论使用内部类实现线程时,通常指的是非静态内部类(也称为成员内部类),因为它们能直接访问...