线程的共享 synchronized  +  volatile + ThreadLocal

<1> synchronized 锁住的是对象,当用它来锁住一个类时,实际上也是锁的一个对象。 用了synchronized 就没必要用 volatile, 对于 synchronized 锁住的对象。

<2>最轻量的同步机制 volatile:
特性:只保证可见性。 如定义一个static变量,在主线程中改变了它,分线程不能感知到主线程修改了它。
适用场景:大量读,少量写。

<3>ThreadLocal: 为每一个线程提供变量的副本,实现线程的隔离,每个线程只访问自己的数据。 如:spring在实现事务的时候,TransactionManager, @Transactional.
为什么spring在实现事务的时候要引入ThreadLocal? 答案:每个线程保存自己的连接, 可能调用多次dao, 避免每次调dao都要传递参数connection。
那么是不是可以考虑把 连接 绑定到这个线程上面?? 这就是spring在实现事务的时候使用 ThreadLocal 的原因。 一般用到的方法有: set(T) get() remove()
Thread 类中有一个成员变量, ThreadLocalMap threadLocals。 ThreadLocalMap 以 ThreadLocal<>为键,里面定义了一个 Entry[]数组。 因为一个线程拥有的副本可能有多个,初始大小为16.

class ThreadLocalMap{ static class Entry{} private Entry[] entry; } 通过位运算取到自己的副本。当我们set到ThreadLocal时,实际上是赋值给我们自己的ThreadLocalMap。
当有重复的时候,它会用nextHashCode()再计算。 ThreadLocal不保证变量同步

强引用:Object obj = new Object();
SoftRefence 要发生内存溢出了,强制回收;
弱引用:只要发生gc,就一定会回收; Entry extends WeakRefence. 可以看出ThreadLocal是软引用。
虚引用:最弱。

引发的内存泄露分析:
Stack Heap

ThreadLocalRef ---- ThreadLocal -- [key, value]
/
CurrentThreadRef ---- CurrentThread -- Map

当我们发生gc时,threadLocal被回收,value就无法被引用到了。即发生内存泄漏。 解决办法: threadLocal.remove();

get/set方法中都有调清除,但是不保证一定清除。 但是remove一定清除。 没内存泄露是可能一直在调用 set/get 方法

那它为什么要用弱引用? 如果用强引用,发生内存泄漏就是必然的。因为Map指向的必然。。。。

ThreadLocal 线程不安全??? 因为它可以存共享变量,虽然是不同的引用,但是实例是一个。

synchronized + volatile + ThreadLocal的更多相关文章

  1. synchronized&volatile

    synchronized(JVM实现的锁) 通过这两个关键字,我们可以很容易的实现同步多个任务的行为,可以实现同一时刻,只能有一条线程去访问共享资源 一: 修饰普通方法 多个线程,共同去竞争访问,方法 ...

  2. Java Synchronized 与 ThreadLocal 异同

    同:都是为了线程安全 异:synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问.而ThreadLocal为每一个线程都提供了变量的副本, 使得每个线程在某一时间访问到的并 ...

  3. java多线程synchronized volatile解析

    先简单说说原子性:具有原子性的操作被称为原子操作.原子操作在操作完毕之前不会线程调度器中断.即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行.在Java中,对除了l ...

  4. 拜托,别再问我怎么自学 Java 了!和盘托出

    假如有那么残酷的一天,我不小心喝错了一瓶药,一下子抹掉了我这十多年的编程经验,把我变成了一只小白.我想自学 Java,并且想要找到一份工作,我预计需要 6 个月的时间,前提条件是每天都处于高效率的学习 ...

  5. paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象)

    paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象) 1     锁的缺点 2     CAS(Compare ...

  6. volatile 与 synchronized 区别

    在Java中,为了保证多线程读写数据时保证数据的一致性,可以采用两种方式: 同步 如用synchronized关键字,或者使用锁对象. volatile 使用volatile关键字用一句话概括vola ...

  7. java 里面保留字volatile及其与synchronized的区别

           锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility).互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议, ...

  8. java 语言多线程可见性(synchronized 和 volatile 学习)

    共享变量可见性实现的原理 java 语言层面支持的可见性实现方式: synchronized volatile 1. synchronized 的两条规定: 1 线程解锁前,必须把共享变量的最新值刷新 ...

  9. 13.volatile与synchronized比较

    synchronized,volatile都解决了共享变量 value 的内存可见性问题,但是前者是独占锁,同时只能有一个线程调用 get()方法,其他调用线程会被阻塞, 同时会存在线程上下文切换和线 ...

随机推荐

  1. [SinGuLaRiTy] 2017-07-26 综合性测试

    [SinGuLaRiTy-1032] Copyright (c) SinGuLaRiTy 2017. All Rights Reserved.               单词 (word) 题目描述 ...

  2. Jmeter-逻辑控制器之Foreach

    ForEach 作用:用来遍历当前元素的所有可执行场景:在用户自定义变量中读取一系列相关的变量,该控制器下的采样器或控制器都会被执行一次或多次,每次读取不同的变量值: 输入变量前缀:在其中输入需要遍历 ...

  3. 开窗函数Over用法

    比如我们有这个表: 销售记录表 日期 姓名 产品 销售额 201601 A 电脑 12560 201601 A 手机 6501 201601 A 平板 8510 201602 A 手机 1560 20 ...

  4. 「FJ2014集训」采药人的路径

    啦啦啦 来写一篇题解 洛谷链接: P4930 「FJ2014集训」采药人的路径 统计路径?嗯往点分治上想. 把0和1转化为-1和1,求和完dis为0的路径就是阴阳平衡的路径了. 如果题目没有限制要有中 ...

  5. JDK 1.6.0_45 下载

    Java SE Development Kit 6u45 Product / File Description File Size Download password Linux x86 65.46 ...

  6. [国家集训队]happiness 最小割 BZOJ 2127

    题目描述 高一一班的座位表是个n*m的矩阵,经过一个学期的相处,每个同学和前后左右相邻的同学互相成为了好朋友.这学期要分文理科了,每个同学对于选择文科与理科有着自己的喜悦值,而一对好朋友如果能同时选文 ...

  7. Job for postfix.service failed because the control process exited with error code. See "systemctl status postfix.service" and "journalctl -xe" for details.

    这是因为防火墙或者配置文件导致,无法启动的邮件服务!! 首先关闭防火墙! 修改配置文件 vim /etc/postfix/main.cf inet_protocols = ipv4 inet_inte ...

  8. maven 配置jetty 插件

    <plugin> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-maven-plugin ...

  9. 读经典——《CLR via C#》(Jeffrey Richter著) 笔记_友元程序集

    [应用场景] 程序集A访问程序集B定义的Internal访问类型的类的成员. [使用方式] 在构建程序集B的时候,引入System.Runtime.CompilerServices,以此来添加Inte ...

  10. java 数据库连接

    一.JDBC(Java Database Connectivity) JDBC是Java语言中访问数据库的应用程序接口,可以为多种关系数据库提供统一访问. jdbc.properties jdbc.d ...