Java 线程 6 - volatile和ThreadLocal
2017-11-01 10:00
246 查看
参考:
Java 线程 0 - 前言
主要内容:
参考:
Java关键字volatile的理解与正确使用
Java并发编程:volatile关键字解析
在现代处理器系统中,线程可能会从高速缓存中读取共享变量值,这样有可能会出现高速缓存中的变量值和内存中的变量值不一致
当一个共享变量被
由于
参考:
java.lang Class ThreadLocal
《疯狂Java讲义 16.10 线程相关类》中给出一个示例
定义一个账户类,该类仅包含线程名:
可以在定义
定义一个线程类
测试函数如下:
测试函数中共有
其余参考:
为什么说”JAVA中的ThreadLocal是最简单的非阻塞同步”?
将ThreadLocal变量设置为private static的好处是啥?
ThreadLocal和synchronized的区别?
Java中的ThreadLocal通常是在什么情况下使用的?
Java 线程 0 - 前言
主要内容:
volatile
ThreadLocal
volatile
参考:Java关键字volatile的理解与正确使用
Java并发编程:volatile关键字解析
volatile关键字用于定义变量,保证变量的 可见性 和 指令重排序
在现代处理器系统中,线程可能会从高速缓存中读取共享变量值,这样有可能会出现高速缓存中的变量值和内存中的变量值不一致
当一个共享变量被
volatile修饰时,更新后的值会立即保存到内存中,而线程读取该共享变量时,也必须从内存读取
由于
volatile关键字不能保证 有序性,其适合修饰的共享变量应该仅包含原子操作,比如对
boolean变量的操作。相对的,如果需要对变量进行加减操作,则不具备原子性
ThreadLocal
参考:java.lang Class ThreadLocal
ThreadLocal类可以为线程创建一个共享变量副本,每个线程对该变量的操作均不会影响其它线程
《疯狂Java讲义 16.10 线程相关类》中给出一个示例
定义一个账户类,该类仅包含线程名:
public class Account { private ThreadLocal<String> name = new ThreadLocal<String>() { @Override protected String initialValue() { // return super.initialValue(); return "Hi zj"; } }; public Account(String name) { System.out.println("初始化前:" + this.name.get()); setName(name); System.out.println("初始化后:" + this.name.get()); } public String getName() { return name.get(); } public void setName(String name) { this.name.set(name); } }
可以在定义
ThreadLocal对象时调用函数
initialValue初始化(未初始化的对象值默认为空)
定义一个线程类
MyThread,使用账户类作为成员变量,并保存其线程名:
public class MyThread extends Thread { private Account account; public MyThread(Account account, String name) { super(name); this.account = account; } @Override public void run() { for (int i = 0; i < 10; i++) { if (i == 6) { account.setName(getName()); } System.out.println(account.getName() + " i = " + i); } } }
测试函数如下:
public static void main(String[] args) { Account account = new Account("Hello World"); new MyThread(account, "thread-1").start(); new MyThread(account, "thread-2").start(); for (int i = 0; i < 10; i++) { if (i == 6) { account.setName(Thread.currentThread().getName()); } System.out.println(account.getName() + " i = " + i); } }
测试函数中共有
3个线程:
main/
thread-1/
thread-2,由结果可知,
ThreadLocal对象各自为这
3个线程保存了一个副本,它们的修改不会影响对方
其余参考:
为什么说”JAVA中的ThreadLocal是最简单的非阻塞同步”?
将ThreadLocal变量设置为private static的好处是啥?
ThreadLocal和synchronized的区别?
Java中的ThreadLocal通常是在什么情况下使用的?
相关文章推荐
- Java线程:volatile关键字
- Java线程安全之volatile关键字
- Java线程工作内存与主内存变量交换过程及volatile关键字理解
- Java并发库(五、六、七):线程范围内共享数据、ThreadLocal、共享数据的三种方法
- Java线程(二):线程同步synchronized和volatile
- java多线程:5、线程范围内的数据共享_ThreadLocal
- Java线程锁,以及volatile、synchronized、Lock关键字
- Java中线程封闭之ThreadLocal
- Java 线程概述: 线程种类、状态,原子性、内存可见性、synchronized、volatile
- Java Concurrency in Practice 之Volatile和ThreadLocal
- java线程同步volatile与synchronized
- Java线程(二):线程同步synchronized和volatile
- java线:辛格尔顿隐藏ThreadLocal实现线程数据共享
- 【java基础 14】锁的粒度:ThreadLocal、volatile、Atomic和Synchronized
- Java多线程——线程范围内共享变量和ThreadLocal
- Java代码质量改进之:使用ThreadLocal维护线程内部变量
- JAVA高级:多核线程-volatile原理与技巧
- Java 线程 — synchronized、volatile、锁
- java 线程之synchronized,volatile,原子类,Lock锁相关
- java ThreadLocal及线程封闭