ThreadLocal是java中轻量级的线程同步解决方法,为了达到线程安全的目的,采用的是空间隔离的方法。使用方式如下:
1、定义2个会被多线程共享的bean,一个使用ThreadLocal,一个不使用任何线程同步措施
package bean; public interface IShareBean { public void get(); public void autoInc(); } package bean.impl; import bean.IShareBean; public class SafeShareBeanImpl implements IShareBean { // 创建一个线程局部变量并赋初值 // 该变量是被所有访问SafeShareBeanImpl类的线程共享的,但不存在线程安全问题 private static ThreadLocal<Integer> localCount = new ThreadLocal<Integer>() { protected Integer initialValue() { return 0; }; }; public void get() { System.out.println(Thread.currentThread().getName() + ",after increment:" + localCount.get()); } public void autoInc() { int count = localCount.get(); System.out.println(Thread.currentThread().getName() + ",before increment:" + count); count++; localCount.set(count); } } package bean.impl; import bean.IShareBean; public class UnSafeShareBeanImpl implements IShareBean { private int count = 0; public void get() { System.out.println(Thread.currentThread().getName() + ",after increment:" + count); } public void autoInc() { System.out.println(Thread.currentThread().getName() + ",before increment:" + count); count++; } }
2、定义一个线程实现类,用来访问共享bean中的方法
package thread; import bean.IShareBean; public class ThreadBody implements Runnable { private IShareBean bean = null; public ThreadBody(IShareBean bean) { this.bean = bean; } @Override public void run() { bean.autoInc(); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } bean.get(); } }
3、测试线程安全
import thread.ThreadBody; import bean.IShareBean; import bean.impl.SafeShareBeanImpl; import bean.impl.UnSafeShareBeanImpl; public class Client { public static void main(String[] args) { //会被线程共享的对象 IShareBean unsafe = new UnSafeShareBeanImpl(); IShareBean safe = new SafeShareBeanImpl(); // 线程1和2,共享unsafe Thread one = buildThread("unsafe-thread-1", unsafe); Thread two = buildThread("unsafe-thread-2", unsafe); // 线程安全3和4,共享safe Thread three = buildThread("safe-thread-1", safe); Thread four = buildThread("safe-thread-2", safe); three.start(); four.start(); one.start(); two.start(); } public static Thread buildThread(String name, IShareBean bean) { ThreadBody body = new ThreadBody(bean); Thread thread = new Thread(body); thread.setName(name); return thread; } }
运行以上代码可以发现,使用ThreadLocal,的确以一种很优雅的方式解决了线程安全问题。
相关推荐
JDK配置测试程序JDK配置测试程序JDK配置测试程序JDK配置测试程序JDK配置测试程序JDK配置测试程序JDK配置测试程序JDK配置测试程序
jdk 测试 在cmd 里面 ,进行测试 为了保证系统的运行
JDK1.7.0配置的步骤与测试 此配置说明非常详细,具体到每一步,每步都有截图说明。 望此文档对你有所帮助。
JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11安装包,JDK11安装包JDK11...
JDK安装和使用方法详细说明。
jdk1.8英文版本和jdk1.6中文版本,这是关于开发时候查询相应类和方法使用的
一般不推荐下载最新版jdk,大家想,新出来的事物,都会有一个测试期有些功能不怎么稳定,而jdk1.8要稍微稳定些,所以在学校里面老师都一般让我们下载jdk1.8。有些时候我们去国外的官网上下载东西,不仅要克服英文...
apache-jmeter-5.4.3.zip jmeter5.4.3需要java8+的环境,本压缩包中包含了 jdk8 和 jmeter5.4.3 两个压缩包。 下载至本地后,解压压缩包,点击(jmeter)进入bin文件夹,双击jmeter.bat文件,会启动JMeter GUI工具
关于jdk环境变量的设置问题给你一个文档,在xp和win7上面都可以用的 1.安装j2sdk以后,需要配置一下环境变量,右击我的电脑->属性->高级->环境变量->用户变量中单击[新建(N)]添加以下环境变量(假定你的j2sdk安装在D...
该工具可用于正则表达式的测试,该工具使用的可运行jar包JDK11编译,请使用JDK11及以上版本运行jar,资源附带源码,JDK版本不到JDK11的网友可自行编译运行。此为老版本,添加了一些小功能的新版本已上传,...
安装JDK后,下载此文件进行JDK的测试
jdk中常用的测试用例
jdk的详细配置 与 配置完成后的成功与否的测试
JDK11使用MapStruct
jdk7 jdk8 jdk9 jdk10 jdk11 jdk12 jdk13 jdk14 (win-64位) 资源共享
list转map的测试类,用到jdk1.8的新特性,感觉用起来很方便
mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk1.8安装包!mac系统jdk...
jdk8-251 kettle9.2使用jdk版本
JDK6的新特性之一:Desktop类和SystemTray类 JDK6的新特性之二:使用JAXB2来实现对象与XML之间的映射 JDK6的新特性之三:理解StAX StAX(JSR 173)是JDK6.0中除了DOM和SAX之外的又一种处理XML文档的API JDK6的新特性...