- 浏览: 398212 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (760)
- 股票日志 (26)
- Selenium (0)
- selenium 2 环境的搭建 (1)
- 并发 (7)
- 框架开发 (1)
- 动态代理 (2)
- Struts2 (2)
- POI (2)
- jdk (3)
- maven (31)
- spring (35)
- mysql (31)
- 工作机会 (3)
- xtream (1)
- oracle dbms_metadata GET_DDL (0)
- SSI (1)
- DB (61)
- powermock (4)
- java 基础 (25)
- 多线程 (11)
- 高手 (2)
- java 底层 (2)
- 专业网站 (1)
- 开发联想 (1)
- 开发联想 (1)
- bat文件 (2)
- 清queue 语句 (1)
- 清queue 语句 (1)
- jquery (7)
- html5 (1)
- Jenkins (10)
- Linux (17)
- 工作issue (2)
- tomcat log (3)
- jvm (23)
- 项目细节 (0)
- oracle (41)
- 泛型 (3)
- 新知识点 (1)
- 数据库ddl 语句 (0)
- AQ (2)
- jms (0)
- 网络资源 (6)
- github (6)
- Easymock (1)
- Dom 解析XML (1)
- windows命令 (2)
- java (7)
- 正则表达式 (5)
- sequence (1)
- oracle 表meta信息 (1)
- 小工具技巧 (1)
- 辅助工具 (1)
- Junit (1)
- 泛型 generic (2)
- Java程序设计 (1)
- cglib (2)
- 架构师之路 (1)
- 数据库连接池 (5)
- c3p0 (1)
- eclipse使用 (1)
- oracle sql plus (1)
- 码农人生 (3)
- SVN (15)
- sqlplus (2)
- jsoup (1)
- 网络爬虫 (2)
- 新技能 (1)
- zookeeper (4)
- hadoop (1)
- SVNKIT (1)
- 从工具到知识点的整理 (1)
- log4j (13)
- 读文件 (0)
- 转义字符 (1)
- command (1)
- web service (3)
- 锁 (1)
- shell 脚本 (1)
- 遇到的错误 (2)
- tomcat (14)
- 房产 (5)
- bootstrap jquery ui (1)
- easyui (2)
- 个人征信 (1)
- 读写分离 (1)
- 备份 (1)
- rmi (6)
- webservice (1)
- JMX (4)
- 内存管理 (3)
- java设计 (1)
- timer (1)
- lock (2)
- concurrent (2)
- collection (1)
- tns (1)
- java基础 (15)
- File (1)
- 本机资源 (1)
- bat (1)
- windows (4)
- 数据结构 (3)
- 代码安全 (1)
- 作用域 (1)
- 图 (2)
- jvm内存结构 (1)
- 计算机思想 (1)
- quartz (6)
- Mongo DB (2)
- Nosql (4)
- sql (5)
- 第三方Java 工具 jar 项目 (2)
- drools (1)
- java swing (2)
- 调用console (1)
- runtime (1)
- process (1)
- swing (2)
- grouplayout (1)
- dubbo (0)
- bootstrap (0)
- nodejs (2)
- SVN hooks (1)
- jdbc (3)
- jdbc error (1)
- precedure (1)
- partition_key (1)
- active mq (1)
- blob (2)
- Eclipse (6)
- web server (1)
- bootstrapt (2)
- struts (1)
- ajax (1)
- js call back (1)
- 思想境界拓展 (1)
- JIRA (1)
- log (1)
- jaxb (3)
- xml java互相转换 (1)
- 装修 (2)
- 互联网 (2)
- threadlocal (3)
- mybatis (22)
- xstream (1)
- 排序 (1)
- 股票资源 (1)
- RPC (2)
- NIO (3)
- http client (6)
- 他人博客 (1)
- 代理服务器 (1)
- 网络 (2)
- web (1)
- 股票 (5)
- deadlock (1)
- JConsole (2)
- activemq (3)
- oralce (1)
- 游标 (1)
- 12月13日道富内部培训 (0)
- grant (1)
- 速查 (2)
- classloader (4)
- netty (4)
- 设计模式 (2)
- 缓存 (2)
- ehcache (2)
- framework (1)
- 内存分析 (2)
- dump (1)
- memory (2)
- 多高线程,并发 (1)
- hbase (2)
- 分布式系统 (1)
- socket (3)
- socket (1)
- 面试问题 (1)
- jetty (2)
- http (2)
- 源码 (1)
- 日志 (2)
- jni (1)
- 编码约定 (1)
- memorycache (1)
- redis (13)
- 杂谈 (1)
- drool (1)
- blockingqueue (1)
- ScheduledExecutorService (1)
- 网页爬虫 (1)
- httpclient (4)
- httpparser (1)
- map (1)
- 单例 (1)
- synchronized (2)
- thread (1)
- job (1)
- hashcode (1)
- copyonwriteArrayList (2)
- 录制声音 (1)
- java 标准 (2)
- SSL/TLS (1)
- itext (1)
- pdf (1)
- 钻石 (2)
- sonar (1)
- unicode (1)
- 编码 (4)
- html (1)
- SecurityManager (1)
- 坑 (1)
- Restful (2)
- svn hook (1)
- concurrentHashMap (1)
- 垃圾回收 (1)
- vbs (8)
- visual svn (2)
- power shell (1)
- wmi (3)
- mof (2)
- c# (1)
- concurrency (1)
- 劳动法 (1)
- 三国志游戏 (2)
- 三国 (1)
- 洪榕 (2)
- 金融投资知识 (1)
- motan (1)
- tkmybatis mapper (1)
- 工商注册信息查询 (1)
- consul (1)
- 支付业务知识 (2)
- 数据库备份 (1)
- 字段设计 (1)
- 字段 (1)
- dba (1)
- 插件 (2)
- PropEdit插件 (1)
- web工程 (1)
- 银行业知识 (2)
- 国内托管银行 (1)
- 数据库 (1)
- 事务 (2)
- git (18)
- component-scan (1)
- 私人 (0)
- db2 (14)
- alias (1)
- 住房 (1)
- 户口 (1)
- fastjson (1)
- test (6)
- RSA (2)
- 密钥 (1)
- putty (1)
- sftp (1)
- 加密 (1)
- 公钥私钥 (3)
- markdown (1)
- sweet (1)
- sourcetree (1)
- 好工具 (1)
- cmd (1)
- scp (1)
- notepad++ (1)
- ssh免密登录 (1)
- https (1)
- ssl (2)
- js (2)
- h2 (1)
- 内存 (2)
- 浏览器 (1)
- js特效 (1)
- io (1)
- 乱码 (1)
- 小工具 (1)
- 每周技术任务 (1)
- mongodb (7)
- 内存泄漏 (1)
- 码云 (2)
- 如何搭建java 视频服务器 tomcat (1)
- 资源 (1)
- 书 (1)
- 四色建模法 (1)
- 建模 (1)
- 配置 (1)
- 职位 (1)
- nginx (1)
- excel (1)
- log4j2 (2)
- 做菜 (1)
- jmap (1)
- jspwiki (1)
- activiti (1)
- 工作流引擎 (1)
- 安卓 (1)
- acitviti 例子 (1)
- 二维码 (1)
- 工作流 (1)
- powerdesign (2)
- 软件设计 (1)
- 乐观锁 (1)
- 王者荣耀 (1)
- session (2)
- token (5)
- cookie (4)
- springboot (24)
- jwt (2)
- 项目路径 (1)
- magicbook (1)
- requestType (1)
- json (2)
- swagger (1)
- eolinker (1)
- springdata (1)
- springmvc (1)
- controlleradvice (1)
- profile (1)
- 银行四要素 (1)
- 支付人员资源 (1)
- 支付渠道 (1)
- yaml (1)
- 中文编码 (1)
- mongo (2)
- serializable (1)
- 序列化 (1)
- zyd (1)
- unittest (1)
- 工具 (1)
- Something (1)
- 通达信 (1)
- protobuf (1)
- 算法 (1)
- springcloud (2)
- hikari (1)
- rocketmq (7)
- cachecloud (1)
- serfj (1)
- axure (1)
- lombok (1)
- 分布式锁 (1)
- 线程 (2)
- 同步代码块 (1)
- cobar (1)
- mq (1)
- rabbitmq (1)
- 定时执行 (1)
- 支付系统 (3)
- 唱歌 (1)
- elasticjob (1)
- 定时任务 (1)
- 界面 (1)
- flink (2)
- 大数据 (1)
- 接私活 (0)
- 内部培训 (2)
最新评论
-
dannyhz:
做股票从短线 试水,然后 慢慢发现 波段和 中期的故事可挖, ...
搭台唱戏 -
dannyhz:
http://developer.51cto.com/art/ ...
如何自己开发框架 它的注意点是什么
引用
thread local variable 就是这么拉风,在多线程的情况下, 把一个公用的类可以共享而没有多线程的问题
先写一个接口
package com.ssc.dbcttool.test; public interface Exec { public Exec firstActionToPrepare(); public void secondAction(); }
再写一个客户端
package com.ssc.dbcttool.test; public class PatternExec { public static void main(String[] args) { Exec onlyOne = new Processor(); 体现出本例需要的threadlocal的风采 //Exec onlyOne = new Processor1(); low 逼 同意变量被反复自增的现象 Thread t1 = new DoThingThread(onlyOne); Thread t2 = new DoThingThread(onlyOne); t1.start(); t2.start(); } } 这个线程里用的都是接口 这个在后面使用的时候很方法, 客户端修改测试,只需要改具体实现类就可以 class DoThingThread extends Thread{ private Exec only; public DoThingThread(Exec onlyOne){ only = onlyOne; } @Override public void run() { only.firstActionToPrepare().secondAction(); } }
第一个使用 线程内部变量的processor , 在客户端被两个线程各调用一次的时候, 不会有累加的情况发生, 打印出来时 localVal的值始终就是1
package com.ssc.dbcttool.test; public class Processor implements Exec{ private ThreadLocal<Integer> localVal = new ThreadLocal<Integer>(); public Exec firstActionToPrepare(){ if(localVal.get()!=null){ Integer oldVal = localVal.get(); localVal.set(Integer.valueOf(oldVal.intValue() + 1)); }else{ localVal.set(Integer.valueOf(1)); } return this; } public void secondAction(){ System.out.println(localVal.get()); } }
第二个类使用了 一个变量, 传入两个线程, 线程赋值的速度很快,并且使用实际上同一个变量,最终结果是 val 变成 2了
package com.ssc.dbcttool.test; public class Processor2 implements Exec{ private Integer localVal = new Integer(0); public Exec firstActionToPrepare(){ localVal++; return this; } public void secondAction(){ System.out.println(localVal); } }
相关推荐
在这个例子中,每个线程都有自己的计数器副本,互不干扰。 ### 理解ThreadLocal原理 ThreadLocal内部通过一个ThreadLocalMap来存储每个线程的副本。这个Map的键是ThreadLocal实例,值是线程的局部变量。每个线程都...
本例以序列号生成的程序为例,展示ThreadLocal的使用
例如,我们可以创建一个ThreadLocal变量来保存每个线程的JDBC连接,这样每个线程都有自己独立的连接,避免了连接的共享和线程安全问题。下面是一个ThreadLocal的简单应用示例: ```java public class ...
首先,ThreadLocal原理是基于每个线程创建一个私有的数据存储结构(ThreadLocalMap),使得线程可以拥有自己独立的数据副本,而不会与其他线程共享。这意味着,即使多个线程访问相同的变量,它们也各自拥有这个变量...
在这个例子中,`threadLocal`变量被两个线程分别设置为10和20,每个线程看到的都是自己设置的值,不会互相干扰。这是因为`ThreadLocal`在每个线程内部维护了一个独立的副本。 值得注意的是,虽然`ThreadLocal`可以...
在这个例子中,getSession()方法会检查ThreadLocal中是否存在Session,若不存在则创建并设置,而closeSession()方法则负责关闭并移除当前线程的Session副本。 总结来说,ThreadLocal是Java中解决多线程数据隔离问题...
在这个例子中,我们定义了一个`ThreadLocal`对象`sequenceNumber`,并重写了`initialValue`方法来设置初始值为0。`getNext`方法每次被调用时都会为当前线程获取一个递增的序列号。 #### 六、总结 通过以上分析,...
这样,当线程访问 ThreadLocal 变量时,实际上是访问的自己的副本,而不会影响其他线程的副本。 我们可以自己模拟 ThreadLocal,例如: ```java public class SimpleThreadLocal{ private Map valueMap=...
在这个例子中,主线程能够成功访问到mPerson,但在子线程中,尝试访问ThreadLocal的值时,会抛出NullPointerException,因为每个线程都有自己的ThreadLocal副本,主线程设置的值不会自动传递给子线程。 **...
尽管它们共享同一个Runnable实例,但每个线程都会有自己的ThreadLocal副本,因此它们的`threadLocal`变量持有不同的值。 总之,Java的ThreadLocal类提供了一种安全、高效的方式,在多线程环境中为每个线程维护独立...
ThreadLocal的主要作用是为每个使用该变量的线程提供独立的变量副本,使得每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。 ThreadLocal简介和使用示例 ThreadLocal只有一个无参的构造...
ThreadLocal 的使用可以通过一个简单的例子来演示。假设我们定义了一个静态的成员变量 num,然后通过构造 5 个线程对这个 num 做递增操作。运行结果可以看到,每个线程都会对这个成员变量做递增,如果线程的执行...
这个简单的例子展示了两个线程分别设置并打印ThreadLocal变量,它们不会相互影响。 7. **局限性**:ThreadLocal不适合跨线程通信,如果需要在多个线程间共享数据,应该考虑使用其他机制,如线程安全的数据结构或...
在这个例子中,每个ThreadTest线程都有自己的thLocal和thLocal2变量,它们在各自的线程上下文中独立设置和获取值,互不影响。即使两个线程都调用了同一个ThreadLocal实例,它们所看到的值也是独立的,因为...
由于每个线程有自己的ThreadLocal变量副本,所以不同线程的输出不会相互影响,展示了ThreadLocal的工作原理。 在Android的Looper类中,ThreadLocal同样发挥了关键作用。Looper类是用来管理消息循环的,每个线程通常...
在这个例子中,`ThreadLocalTest`类中的`threadLocal`变量为每个线程初始化一个随机值,并且`increament()`方法会增加当前线程的`ThreadLocal`变量的值。由于每个线程都有自己的副本,因此不会发生数据竞争。 总结...
在这个例子中,`seqNum`是一个ThreadLocal实例,它的`initialValue()`方法返回0,表示序列号的初始值。`getNextNum()`方法会获取当前线程的序列号副本,增加1后再保存回去,这样每个线程都会拥有自己独立的序列号...
在Java中,每个线程都有自己的ThreadLocal变量副本,通过ThreadLocal可以实现线程安全的变量共享。本文主要介绍了ThreadLocal使用案例的分析,希望能够帮助读者更好地理解ThreadLocal的使用。 在本例中,我们需要...
在这个例子中,`UniqueThreadIdGenerator` 类使用 `ThreadLocal` 来为每个线程生成唯一的 ID。`initialValue()` 方法会在每个线程首次访问 `uniqueNum` 时被调用,返回一个递增的 ID。 5. **注意事项** - 虽然 `...
ThreadLocal是Java提供的一种线程局部变量,每个线程都拥有自己独立的ThreadLocal副本,互不影响。在上述代码中,创建了一个ThreadLocal实例,然后在线程的run()方法中设置值,每个线程设置的数据只对自己可见,...