- 浏览: 1060283 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (501)
- dwr (6)
- javascript (84)
- oracle (66)
- jsp/servlet (18)
- ant (3)
- 基础知识 (12)
- EXT (10)
- My SQL (10)
- java (71)
- spring (37)
- 学习的对象 (2)
- Linux (24)
- 面试 (1)
- HTML/CSS (11)
- tomcat (11)
- 收藏夹 (2)
- Power Designer (2)
- struts.xml配置文件 (1)
- sturts2 (3)
- myeclipse (8)
- eclipse (7)
- Maven (34)
- SVN (3)
- SAP JCO (2)
- JBOSS (11)
- webservice (8)
- word (1)
- 敏捷开发 (1)
- sybase (4)
- Nexus (3)
- EhCache (3)
- log4j (3)
- Cookie (4)
- Session (4)
- CXF (7)
- AXIS (2)
- SSO (1)
- LDAP (1)
- velocity (2)
- Jquery (5)
- redis (2)
- http (4)
- dojo (1)
- Linux资源监控软件mnon的安装与运用 (1)
- notepad++ (1)
- EA (1)
- UML (1)
- JasperReports (1)
- 权限 (0)
- freemarker (4)
- Spring MVC (1)
- JMS (1)
- activeMQ (1)
- hession (3)
- 安全 (1)
- ibatis (2)
- log (1)
- nginx (1)
最新评论
-
winhbb:
我刚好遇到了一个问题(在可以依赖注入的场合有效):有两个模块A ...
解决Maven项目相互依赖/循环依赖/双向依赖的问题 -
nanjiwubing123:
long3ok 写道你好 XmlOutputFormatter ...
用XStream转换复杂XML -
zhoujianboy:
另外一个方法实现eclipse tomcat 热部署:http ...
eclipse下实现maven项目在tomcat容器热部署方法 -
long3ok:
你好 XmlOutputFormatter 请问这个类是在什么 ...
用XStream转换复杂XML -
ganbo:
总结的好,文章给力。
解决Maven项目相互依赖/循环依赖/双向依赖的问题
一、ThreadLocal类
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明,在其它的一些语言编译器实现(如IBM XL FORTRAN)中,它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。
举例:
1、类SeriaNum类为每一个线程创建一个唯一的序列号,在线程生命周期内不变。
2、测试
输出:
0
1
2
3
4
5
6
结论:可以看书abcdefg六个线程的序列号确定了后,不在变化。
二、 ThreadLocal与其它同步机制的比较
ThreadLocal和其它同步机制相比有什么优势呢?ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的,使用这种同步机制需要很细致地分析在什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal,或者把该对象的特定于线程的状态封装进ThreadLocal。
由于ThreadLocal中可以持有任何类型的对象,所以使用ThreadLocal get当前线程的值是需要进行强制类型转换。但随着新的Java版本(1.5)将模版的引入,新的支持模版参数的ThreadLocal类将从中受益。也可以减少强制类型转换,并将一些错误检查提前到了编译期,将一定程度地简化ThreadLocal的使用。
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明,在其它的一些语言编译器实现(如IBM XL FORTRAN)中,它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。
举例:
1、类SeriaNum类为每一个线程创建一个唯一的序列号,在线程生命周期内不变。
public class SerialNum { // The next serial number to be assigned private static int nextSerialNum = 0; @SuppressWarnings("unchecked") private static ThreadLocal serialNum = new ThreadLocal() { protected synchronized Object initialValue() { return new Integer(nextSerialNum++); } }; public static int get() { return ((Integer) (serialNum.get())).intValue(); } }
2、测试
public class thred extends Thread{ private int num; public void run(){ num=SerialNum.get(); System.out.println(SerialNum.get()); } public static void main(String[] args) { thred a=new thred(); thred b=new thred(); thred c=new thred(); thred d=new thred(); thred e=new thred(); thred f=new thred(); thred g=new thred(); a.start(); b.start(); c.start(); d.start(); e.start(); f.start(); g.start(); try { sleep(10000); } catch (InterruptedException e1) { e1.printStackTrace(); } System.out.println(b.num); } }
输出:
0
1
2
3
4
5
6
结论:可以看书abcdefg六个线程的序列号确定了后,不在变化。
二、 ThreadLocal与其它同步机制的比较
ThreadLocal和其它同步机制相比有什么优势呢?ThreadLocal和其它所有的同步机制都是为了解决多线程中的对同一变量的访问冲突,在普通的同步机制中,是通过对象加锁来实现多个线程对同一变量的安全访问的。这时该变量是多个线程共享的,使用这种同步机制需要很细致地分析在什么时候对变量进行读写,什么时候需要锁定某个对象,什么时候释放该对象的锁等等很多。所有这些都是因为多个线程共享了资源造成的。ThreadLocal就从另一个角度来解决多线程的并发访问,ThreadLocal会为每一个线程维护一个和该线程绑定的变量的副本,从而隔离了多个线程的数据,每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的整个变量封装进ThreadLocal,或者把该对象的特定于线程的状态封装进ThreadLocal。
由于ThreadLocal中可以持有任何类型的对象,所以使用ThreadLocal get当前线程的值是需要进行强制类型转换。但随着新的Java版本(1.5)将模版的引入,新的支持模版参数的ThreadLocal类将从中受益。也可以减少强制类型转换,并将一些错误检查提前到了编译期,将一定程度地简化ThreadLocal的使用。
发表评论
-
个人草稿使用
2017-08-19 09:02 0深入理解JVM: http://www.cnblogs.co ... -
Thread.setDaemon详解
2015-04-24 21:31 895java中线程分为两种类型:用户线程和守护线程。通过Threa ... -
怎么使用 ConcurrentHashMap 才能是线程安全的?
2015-04-13 11:54 1498public class test { public ... -
21,tomcat关闭钩子
2014-12-31 10:36 723在很多环境下,在关闭应用程序的时候需要做一些清理工作。问题在于 ... -
Java NIO使用及原理分析 (一) 【转载】
2014-10-24 00:04 484【转载】: http://blog.csdn.net/wuxi ... -
Java 两个集合取交集
2014-10-14 21:16 3113public static Set intersectionS ... -
Calendar类roll和add的区别
2014-10-10 22:28 489import java.text.SimpleDateForm ... -
Gson通过借助TypeToken获取泛型参数的类型的方法
2014-09-30 00:26 626[size=medium]最近在使用Goo ... -
HashMap的遍历效率讨论
2014-09-27 20:41 825经常遇到对HashMap中的key和value值对的遍历操作, ... -
Java 泛型
2014-06-26 12:44 852关键字说明 ? 通配符类型 <? extends T&g ... -
Java泛型集合的理解
2014-06-26 00:05 502[size=medium]什么是泛型? 泛型(Generic ... -
关于java字节码框架ASM的学习
2014-06-19 19:22 883一、什么是ASM ASM是一个java字节码操纵框架, ... -
Java动态代理详解
2014-06-19 17:41 855Java动态代理详解: http: ... -
Java内存,字符串文章收集
2014-06-18 16:24 706java--String常量池问题的几个例子 . http:/ ... -
Java内存解析
2014-06-18 11:48 769栈、堆、常量池等虽同 ... -
Java的堆与非堆内存
2014-01-07 10:59 713堆(Heap)和非堆(Non-heap)内存 按照官方的说法: ... -
JMX 资料收集
2014-01-07 10:53 444JavaSky的专栏 http://blog.csdn.net ... -
JAVA 注解示例 详解
2013-11-12 09:36 820注解(Annotation) 为我们在代码中天界信息提供了 ... -
Java 泛型详解
2013-11-11 22:35 796http://www.360doc.com/content/1 ... -
Java中的Enum的使用与分析
2013-11-09 12:49 814enum枚举类型:在实际问 ...
相关推荐
### 知识点详解:Java.lang.ThreadLocal 类 #### 一、概述 **ThreadLocal** 并非线程的一种特殊实现形式,而是一种为每个线程提供独立副本的机制,通常被称为“线程局部变量”。这种机制使得每个线程都可以独立...
在Java 2(J2SE)中,`java.lang`包添加了一些新的类和方法,如`InheritableThreadLocal`,`ThreadLocal`的扩展,使得子线程可以继承父线程的变量,以及`SecurityManager`,用于实现安全管理策略。 过时方法在Java ...
在Java编程语言中,`java.lang`包是所有Java程序的基础,因为它包含了许多核心类和接口,这些类和接口是编写任何Java应用程序所必需的。由于这个包是自动导入的,因此程序员无需在代码中显式地导入`java.lang`。 1....
【标题】:“线程本地(ThreadLocal):Java.lang.ThreadLocal 的实验性无等待并发实现” 在Java编程中,`ThreadLocal`是一个非常重要的工具类,它提供了线程局部变量的功能。线程局部变量是局限于单个线程的变量,...
ThreadLocal,全称为`java.lang.ThreadLocal`,是Java中一个非常重要的工具类,它主要用于在多线程环境中提供线程局部变量。ThreadLocal不是用来解决线程安全问题的,而是为每个线程创建独立的变量副本,确保线程间...
ThreadLocal,全称为`java.lang.ThreadLocal`,是Java中用于处理线程局部变量的一个类。它的设计目标是为每个线程提供一个独立的变量副本,使得这些副本只对当前线程可见,从而实现了线程之间的数据隔离。...
3. **多线程**:Java API支持多线程编程,`java.lang.Thread`类和`java.util.concurrent`包提供了丰富的线程控制和同步机制,如`synchronized`关键字、`ThreadLocal`、`ExecutorService`等。 4. **网络编程**:`...
6. **反射**:`java.lang.reflect`包提供了反射机制,允许在运行时检查类、接口、构造器和方法的信息,并能够动态调用方法和访问字段。 7. **国际化**:`java.text`和`java.util.Locale`支持全球化和本地化,提供...
如果是实现了 `java.lang.Runnable` 接口的类,则需要使用 `Thread` 的构造方法: ```java Thread(Runnable target) Thread(Runnable target, String name) Thread(ThreadGroup group, Runnable target) ...
- 使用 `java.lang.Thread` 类或 `java.lang.Runnable` 接口来定义、实例化和启动新线程。 - 每个Java应用从main()方法开始运行,该方法运行在主线程中。 - 创建新线程时,会产生一个新的调用栈。 - 线程可分为...
Java线程是多任务编程中的核心概念,尤其在Java中,理解并掌握线程...解压后,你可以深入学习线程的调度策略、线程局部变量(`ThreadLocal`)、线程优先级以及其他并发工具类的使用,进一步提升你的Java并发编程能力。
Java中可以通过定义同步方法或使用同步块来实现线程同步。同步方法通过隐式锁定对象来防止多个线程同时访问,而同步块则可以更精确地控制同步范围。 #### 九、Java线程:并发协作-生产者消费者模型 生产者消费者...
- Vector和Hashtable是同步的集合类,但因为性能问题,它们在现代Java编程中较少使用。 - Collections类提供了静态方法以返回同步的集合包装器。 10. Java泛型: - 泛型允许在编译时提供类型检查和类型安全,...
- **`java.lang.Thread`类**:代表一个执行线程,提供了线程的启动、同步和停止的方法。 - **`java.util.concurrent`包**:包含高级并发工具,如`ThreadLocal`用于线程局部变量,`ReentrantLock`可重入锁,以及`...
ThreadLocal,全称为`java.lang.ThreadLocal`,是Java提供的一种线程局部变量,它的每个线程都有自己的副本,线程间互不影响,从而实现无锁化线程封闭。ThreadLocal不是用来解决线程同步问题的,而是用来避免线程间...
- Java提供了多种同步机制来解决多线程并发访问同一资源时可能出现的问题,如同步方法、同步块等。 - 同步方法通过 `synchronized` 关键字修饰类的方法,同步块则通过对特定对象加锁实现。 - **锁机制**: - 锁...
5. **线程同步**:为了避免多个线程间的资源竞争,Java提供了多种同步机制,如`synchronized`关键字、`wait()`, `notify()`, `notifyAll()`方法,以及`Lock`和`Condition`接口。 6. **死锁(Deadlock)**:当两个或...
Java中的线程创建主要有两种方式:一是继承`java.lang.Thread`类并重写`run()`方法;二是实现`java.lang.Runnable`接口,提供`run()`方法实现,然后通过`Thread`类的构造函数传入Runnable对象来创建线程。这两种方式...
- 对于`java.lang`包下的所有类,应该熟悉每个类的作用以及如何使用它们的基本方法。 - 特别是`Object`、`String`、`Math`、`Thread`等类,应该深入理解它们的特性及应用场景。 - 对于集合框架、IO流、网络编程等...