博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java基础之本地线程
阅读量:6758 次
发布时间:2019-06-26

本文共 2261 字,大约阅读时间需要 7 分钟。

hot3.png

java基础之本地线程

一.概述

    1.1 简介

            本地线程主要是解决多线程中数据因并发产生不一致的问题。ThreadLocal由一个静态的class来存放数据,每一个对象都在类似map<threadName,value>的数据结构中加入想要的数据。

    1.2 解释

            1. Threadlocal:可以看作一个整个线程变量管理类。这个变量可以在本线程使用。

            2.ThreadLocal是使用一个静态的 Map<Thead.curentName,Object value> 来存放值. 每次存放都是以线程来存放。所以可以做到绝对的线程安全

            3.主要存放 JDBC connection 之类

    1.3. 方法

            1. protected Object initialValue():返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,并且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。

            2. void set(Object value):设置当前线程的线程局部变量的值。

            3. public Object get():该方法返回当前线程所对应的线程局部变量。

            4. public void remove():将当前线程局部变量的值删除,目的是为了减少内存的占用,该方法是JDK 5.0新增的方法。需要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,所以显式调用该方法清除线程的局部变量并不是必须的操作,但它可以加快内存回收的速度。

    1.4 组成

          1. threadlocal的源码

162508_AMFn_2246410.png

        2. 静态方法赋值

162515_PONe_2246410.png

 

    1.5 总结

        1. ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每个线程的中并发访问的数据提供一个副本,通过访问副本来运行业务,这样的结果是耗费了内存,单大大减少了线程同步所带来性能消耗,也减少了线程并发控制的复杂度。(空间换时间)

        2. ThreadLocal保存的值不能使用原子类型,只能使用Object类型。ThreadLocal的使用比synchronized要简单得多。 

        3. ThreadLocal和Synchonized都用于解决多线程并发访问。但是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。 

        4. Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。 

        5. 当然ThreadLocal并不能替代synchronized,它们处理不同的问题域。Synchronized用于实现同步机制,比ThreadLocal更加复杂。 

二.实例

public class MyThreadLocal {	// 线程本地线程	public static void main(String[] args) {		MyThreadLocal mtl = new MyThreadLocal();		mtl.doMyTest();	}	public void doMyTest() {		ExecutorService es = Executors.newCachedThreadPool();		for (int i = 0; i < 5; i++) {			es.execute(new Test1(i));		}		es.shutdown();	}}class Test1 implements Runnable {	static ThreadLocal
> maps = new ThreadLocal
>() { protected HashMap
 initialValue() { return new HashMap
(); } }; int id; public Test1(int id) { this.id = id; } @Override public void run() { System.out.println(Thread.currentThread().getName() + ": start"); HashMap
 map = maps.get(); for (int i = 0; i < 10; i++) { map.put(i, id * 100 + i); try { Thread.sleep(100); } catch (Exception e) { } } System.out.println(Thread.currentThread().getName() + ": " + map); }}

     理解记忆表

164025_jRW0_2246410.png

转载于:https://my.oschina.net/u/2246410/blog/552386

你可能感兴趣的文章
Ubuntu Server14.04 32位安装odoo8.0简单方法
查看>>
jQuery-easyui下的多表关联的增删改操作
查看>>
我的友情链接
查看>>
兼容IE,Firefox,CSS3 opacity透明度
查看>>
读取Hive中所有表的表结构,并在新Hive库中创建表,索引等
查看>>
XenServer部署系列之02——系统安装及许可
查看>>
linux下FTP服务器搭建
查看>>
程序的查询 ps - 笔记1
查看>>
Conversion to Dalvik format failed with error 1的又一种情形
查看>>
nodejs抓取数据二(列表解析)
查看>>
TextView中实现可点击链接的显示
查看>>
HAOI 树上操作
查看>>
深刻理解Python中的元类(metaclass)以及元类实现单例模式
查看>>
java随机生成n个不相同的整数
查看>>
DIV+CSS基础
查看>>
使用JS完成首页定时弹出广告图片
查看>>
codeforces 500c New Year Book Reading 【思维】
查看>>
Auto reloading enabled
查看>>
GitHub的使用方法
查看>>
AT3576 Popping Balls
查看>>