- 浏览: 39607 次
文章分类
最新评论
1.ThreadLocal简介
早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本.
最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等.
2.部分源码
ThreadLocal中存在ThreadLocalMap 以不同的线程key创建不同的副本。如下ThreadLocal set() /get()方法
3.代码实例
早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。
当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本.
最常见的ThreadLocal使用场景为 用来解决 数据库连接、Session管理等.
2.部分源码
ThreadLocal中存在ThreadLocalMap 以不同的线程key创建不同的副本。如下ThreadLocal set() /get()方法
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }
3.代码实例
/** * Created by wuhao on 15-12-23. */ public class ThreadLocalDemo { public static void main(String[] args) { ThreadStringSeq tss = new ThreadStringSeq(); tss.setState("first"); //切换state ThreadStringClient ts1 = new ThreadStringClient(tss); ThreadStringClient ts2 = new ThreadStringClient(tss); new Thread(ts1).start(); new Thread(ts2).start(); ThreadLocalSeq tls = new ThreadLocalSeq(); System.out.println("Main:" + Thread.currentThread().getName() + " sn:" + tls.getNextState()); //切换state ThreadLocalClient tl1 = new ThreadLocalClient(tls); ThreadLocalClient tl2 = new ThreadLocalClient(tls); new Thread(tl1).start(); new Thread(tl2).start(); } } class ThreadLocalSeq { //通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值 private static ThreadLocal<String> state = new ThreadLocal<String>() { public String initialValue() { return ""; } }; //获取下一个序列值 public String getNextState() { state.set(state.get() + "-->|"); return state.get(); } public void setState(String st){ state.set(st); } } class ThreadStringSeq { //通过匿名内部类覆盖ThreadLocal的initialValue()方法,指定初始值 private static String state = ""; //获取下一个序列值 public String getNextState() { state = state + "-->|"; return state; } public void setState(String st){ state = st; } } class ThreadLocalClient implements Runnable { private ThreadLocalSeq sn; public ThreadLocalClient(ThreadLocalSeq sn) { super(); this.sn = sn; } public void run() { for (int i = 0; i < 3; i++) { //获取线程状态 System.out.println("ThreadLocalClient:" + Thread.currentThread().getName() + " sn:" + sn.getNextState()); } } } class ThreadStringClient implements Runnable { private ThreadStringSeq sn; public ThreadStringClient(ThreadStringSeq sn) { super(); this.sn = sn; } public void run() { for (int i = 0; i < 3; i++) { //获取线程状态 System.out.println("ThreadStringClient:" + Thread.currentThread().getName() + " sn:" + sn.getNextState()); } } }
发表评论
-
JVM内存结构及分析
2017-07-16 19:38 563JVM内存模型 名称特征 ... -
JVM调优实例
2017-06-24 12:30 01.背景:由于最近上线新增业务模块,业务量要增加所以对上线服务 ... -
音视频编码转换-ffmpeg
2016-12-30 18:42 15781.前言 由于最近在做ios与android端需要做a ... -
git did not match any file(s) known to git
2016-04-23 23:49 31181.did not match any file(s) kno ... -
Static工具类线程安全问题
2016-01-08 11:39 23471.静态方法 无论是静态方法还是实例方法,在内存中都只 ... -
JUC-CountDownLatch笔记
2015-12-23 10:53 5621.CountDownLatch简介 CountDownLat ... -
Lambda表达式实现设计模式:命令模式
2015-10-13 09:59 706如何在使用Java 8 Lambda表达式的函数式编程方式时实 ... -
mysql 错误汇总
2015-08-12 16:49 4361.Mysql ERROR 1045 (28000): Acc ... -
Java注解
2015-08-07 11:25 01.@Retention(RetentionPolicy.RU ... -
Base64 编解码 工具类
2015-07-28 22:48 42871.工具类: import java.io.Uns ... -
HttpClient(发送字符串,multipart, 参数等)
2015-07-10 11:12 2083备注:httpclient4.5 发送MultiPart/Pa ... -
转载-搜索引擎实时秒级更新
2015-07-08 14:02 859搜索是很多用户在天 ... -
tomcat-定时任务
2015-03-30 15:27 6571.监听类 import java.util.Timer ... -
JVM-工作原理
2015-03-16 23:26 644一、 JVM的生命周期 1. J ... -
tomcat-启动时启动额外线程并控制线程状态
2015-02-04 18:22 675通过启动线程可以进行后台的操作 1.创建servlet ... -
Exception in thread "main" SoapFault - faultcode: 'soapenv:Server.userException'
2015-01-20 22:32 14281.抛出此类错误大部分都是服务端发布webservice调用出 ... -
Tomcat映射虚拟目录
2015-01-19 22:43 01.设置虚拟目录 <Host>标签</H ... -
android-运行java main方法
2014-12-30 16:10 7191.右键入口类(含有Main方法的)Run Configura ... -
Mybatis 常见错误汇总
2014-12-28 22:31 01.插入数据到数据库是异常 ### Cause: java.s ... -
jsoup
2014-12-17 00:25 01. package com.wuhao.itinfo ...
相关推荐
Java中的线程可以通过继承`Thread`类或实现`Runnable`接口来创建。 2. **线程同步**:为了解决多个线程间的竞态条件,Java提供了多种同步机制,如`synchronized`关键字、`Lock`接口(包括`ReentrantLock`)以及`...
Java源码笔记主要涵盖的是Java编程语言的核心概念和高级特性,特别是与网络编程相关的部分。在深入理解Java源码的过程中,我们不仅可以了解到语言的基础结构,还能探索其在网络通信中的应用。下面将对Java源码和网络...
- 线程封闭(Thread Confinement):一种确保线程安全的策略,通常通过ThreadLocal等机制实现。 - 不可变对象(Immutable Objects):一旦创建就不能被修改的对象,天然线程安全。 学习Java并发编程,重点在于理解...
Java多线程编程是重要部分,JDK6提供了Thread类和Runnable接口,以及synchronized关键字、volatile变量和ThreadLocal等并发工具,帮助开发者构建高效、安全的并发程序。 总之,这份Java JDK6学习笔记将带你全面了解...
- **ThreadLocal**:每个线程都有自己独立的副本,互不干扰,避免了线程安全问题。 8. **线程池** - **ExecutorService**:线程池接口,提供创建、管理和关闭线程池的方法。 - **Executors**:静态工厂方法,...
在Java中,实现多线程主要有两种方式:通过继承Thread类和实现Runnable接口。Thread类提供了创建新线程的基本功能,而Runnable接口则允许你在不修改类继承关系的情况下实现多线程。 1. Thread类解析:Thread类是...
本学习笔记将深入探讨Java多线程的相关知识,包括其原理、实现方式、同步机制以及常见问题。 ### 一、多线程的基本概念 多线程是指在一个程序中存在两个或更多的执行线程,这些线程共享同一内存空间,但各自拥有...
Java线程学习笔记涉及了Java多线程编程的多个关键知识点,本篇知识点整理将详细解释每个概念及其在Java中的实现方式。 基本知识部分包含了Java线程编程的基础内容,它们是并发编程的基石。 任务Runnable是一个接口...
java8 源码 设计模式 java 并发 public class Foo { // SimpleDateFormat is not thread-safe, so give one to each thread private static final ThreadLocal formatter = new ThreadLocal(){ @Override protected ...
### 张孝祥Java多线程与并发库高级应用笔记概览 #### 一、Java多线程技术的重要性与挑战 Java线程技术是软件工程领域不可或缺的一部分,尤其在底层编程、Android应用开发以及游戏开发中,其重要性不言而喻。然而,...
### Java加强笔记知识点详解 #### 一、JDK1.5的新特性 ##### 1. 自动装箱与拆箱 - **自动装箱**:指的是将基本数据类型自动转换成对应的包装类对象。 - 例如:`int i = 1; Integer j = i;` - **自动拆箱**:则是...
在 Java 中,`Thread` 类提供了中断相关的两个方法: 1. `interrupt()`:用于设置线程的中断标志位,如果线程正在阻塞(如等待 I/O 或调用 `sleep()`、`wait()` 等),则会抛出 `InterruptedException`,使线程从...
1、ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); //获取当前线程类加载器 2、InputStream is = classLoader.getResourceAsStream("文件路径/文件名");//通过当前线程的类...
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....
Java互联网架构多线程并发编程原理及实战 视频教程 下载 1-1 课程简介.mp4 1-2 什么是并发编程.mp4 1-3 并发编程的挑战之频繁的上下文切换.mp4 1-4 并发编程的挑战之死锁.mp4 1-5 并发编程的挑战之线程安全....
ThreadLocal类 只读共享:不变对象一定是线程安全的 尽量将域声明为final类型,除非它们必须是可变的 分类 不可变对象 事实不可变对象 线程安全共享 封装有助于管理复杂度 线程...
以上就是Java并发学习笔记的主要内容,这些知识点构成了Java并发编程的基础,理解和掌握它们对于编写高效、稳定的多线程程序至关重要。在实际开发中,需要结合具体场景灵活运用,确保程序的正确性和性能。