在多线程的系统中,当访问共享的可变数据时,通常要使用同步,一种避免使用同步的方式就是不共享数据,让数据仅在线程内部访问,这种叫做线程封闭,从字面上很容易理解。线程封闭技术最常用的地方时JDBC的connection对象。
主要有几种方式1.AD-hoc线程封闭2。.栈封闭3.使用ThreadLocal类。
维持线程封闭最常用的方法就是使用TreadLocal,我这就只介绍这个类。这个类能够将线程中的某个值与保存值联系起来。ThreadLocal提供了get与set方法。这个方法为每个使用该变量的线程都存一份独立的副本。这样get总能返回由当前线程在调用set时设置的最新值。
当某个线程第一次使用get方法时会调用initialValue来获取初始值,如下面代码所示,其实把ThreadLocal<T>这个用一个泛型类表示,可以理解为Map<Tread,T>每个线程对应一个值
ThreadLocal通常用于防止对可变的单实例变量或全局变量进行共享,例如在单线程的应用中维持一个全局的数据库连接,并在程序启动时候初始化链接。由于JDBC不一定是线程安全的,如果在多线程的没有同步协同的情况下使用全局连接,就是非线程安全。通过将JDBC连接保持到ThreadLocal对象中,每个线程都会拥有自己的连接。
private static ThreadLocal<Connection> connectionHandle = new ThreadLocal<Connection>(){ public Connection initialValue(){ try{ return DriverManager.getConnection("DB_URL"); }catch (SQLException e){ return null; } } }; public static Connection getConnection(){ return connectionHandle.get(); }
获取一个连接,TreadLocal会为该线程报错一个副本。这个很好解决了对象资源共享问题,但是ThreadLocal不能滥用,ThreadLocal类似全局变量,会降低代码的重用性,并在类之间引入隐含的耦合性,因此在使用时必须注意。
我们可以通过如下几种方式安全的发布一个对象:
1.在静态初始化函数中初始化一个对象的引用。
2.将对象保存到volatile类型的域中,或者AtomicReferance对象中。
3.将对象的引用保存到某个正确构造对象的final类型域中,
4.将对象的引用保存到个由锁保护的域中:例如vector synchronizedList,HashTable,sysnchronizedMap,
ConcuuentMap中。可以安全的发布给从这些容器中访问的线程。也可以把某个元素放入BlockingQueuce,CourrentedQueue中,可以将元素安全的发布给从这些队列访问的线程中。
相关推荐
ThreadLocal 是 Java 中的一个重要工具类,用于在多线程环境中为每个线程维护独立的变量副本。这个压缩包 "Quartz-ThreadLocal.rar" 内含的学习资源很可能是关于如何在 Quartz 调度器中结合使用 ThreadLocal 的示例...
Java事务和ThreadLocal是两种在Java编程中至关重要的概念,它们分别用于处理多线程环境下的数据一致性问题和提供线程局部变量。 首先,我们来深入理解Java事务。在数据库操作中,事务是一系列操作的集合,这些操作...
【多线程编程详解】 在Java编程中,多线程技术是实现并发处理和提高系统效率的关键。在“多线程-day02”的学习资源中,我们深入探讨了Java内存模型以及多线程的特性与控制机制。 **Java内存模型** Java内存模型,...
在实际应用中,理解ThreadLocal在Spring事务处理中的作用有助于优化并发性能和解决多线程环境下的事务问题。例如,如果线程之间需要共享数据,但又不想影响其他线程,ThreadLocal就是一个理想的选择。同时,也要注意...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
"Java多线程-知识点梳理和总结-超详细-面试知识点" Java多线程是Java编程语言中最基本也是最重要的概念之一。多线程编程可以提高程序的执行效率、改善用户体验和提高系统的可扩展性。但是,多线程编程也存在一些...
- **线程安全的数据共享**:在多线程环境中,通过 ThreadLocal 存储的数据是线程隔离的,每个线程都有自己的独立副本,减少了锁的使用,提高了性能。 - **HTTP 请求上下文**:在 Web 应用中,ThreadLocal 常用来...
**多线程在Java中的应用与理解** Java中的多线程是并发编程的重要组成部分,它允许程序同时执行多个任务,从而提高系统效率和资源利用率。本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步...
java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...
**线程局部变量(ThreadLocal)是Java编程中一个非常重要的工具类,它在多线程环境下提供了线程安全的数据存储。ThreadLocal并不是一个变量,而是一个类,它为每个线程都创建了一个独立的变量副本,使得每个线程都...
在Java多线程编程中,线程安全问题是非常关键的概念,它涉及到多个线程访问共享资源时可能出现的数据不一致或异常情况。本题主要通过两个练习题来加深对线程安全的理解。 ### 练习题1:新年倒计时 #### 题目描述 ...
在Java编程中,多线程是并发处理任务的关键技术,特别是在服务器端开发和高并发场景下。本篇文章将深入探讨“最简单的线程安全问题”,并结合相关源码和工具来帮助理解。线程安全问题通常涉及到多个线程对共享资源的...
Java中的多线程编程是开发高并发应用的关键技术之一,涉及到如何有效管理和利用系统资源,尤其是在处理并发数据访问时,确保数据的安全性和一致性至关重要。在Java中,有多种方式可以实现线程间的数据共享和对象独立...
在了解JAVA多线程面试题之前,我们首先需要...ThreadLocal确保了线程之间数据的隔离性,是非常有用的多线程工具类。 以上就是多线程面试中常见的知识点,掌握这些知识点,对于通过JAVA多线程相关面试将有极大的帮助。
【ThreadLocal】是Java编程语言中用于处理线程局部变量的一个工具类,它提供了一种在多线程环境中实现线程安全的局部变量的方式。在Java的并发编程中,ThreadLocal是一个非常重要的概念,它可以帮助我们创建独立于...
在IT领域,多线程是Java编程中一个重要的概念,特别是在设计高性能、高并发的应用时。本课程由知名IT讲师徐培成主讲,聚焦Java基础的第09天,主题为“多线程状态机变换”。通过学习这部分内容,开发者能够深入理解...
ThreadLocal是Java编程语言中的一个类,用于在多线程环境下提供线程局部变量。它为每个线程创建了一个独立的变量副本,每个线程只能访问自己的副本,不会影响其他线程。这种机制有助于实现线程安全,尤其在需要线程...
多线程是Java中的核心特性,它使得程序能够同时执行多个任务,提高了应用程序的效率和响应性。本教程聚焦于Java多线程的创建与常用方法,帮助开发者深入理解这一关键概念。 在Java中,线程的创建主要有两种方式:...
Java多线程编程中,临界区和ThreadLocal是两种重要的并发控制机制,它们用于解决多线程环境下的数据安全问题。 1. **临界区(Critical Section)** 临界区是指一段代码,它在同一时刻只允许一个线程进行访问。在...
- ThreadLocal 主要用于解决多线程环境下的数据隔离问题,提供线程私有的数据副本。 - **性能影响:** - Synchronized 的性能开销较大,尤其是在高并发环境下,因为涉及锁的获取和释放。 - ThreadLocal 相对来说...