本文将介绍ThreadLocal的用法,并且指出大部分人对ThreadLocal 的误区. 先来看一下ThreadLocal的API: 1.构造方法摘要 ThreadLocal(): 创建一个线程本地变量. 2.方法摘要 void set(T value): 将此线程局部变量的当前线程副本中的值设置为指定值. T get(): 返回此线程局部变量的当前线程副本中的值. void remove():移除此线程局部变量当前线程的值. protected T initialValue():返回此线…
转载请标明出处: http://blog.csdn.net/forezp/article/details/77620769 本文出自方志朋的博客 什么是线程封闭 当访问共享变量时,往往需要加锁来保证数据同步.一种避免使用同步的方式就是不共享数据.如果仅在单线程中访问数据,就不需要同步了.这种技术称为线程封闭.在Java语言中,提供了一些类库和机制来维护线程的封闭性,例如局部变量和ThreadLocal类,本文主要深入讲解如何使用ThreadLocal类来保证线程封闭. 理解ThreadLocal…
假设现在有个公共的变量 data,有不同的线程都可以去操作它,如果在不同的线程对 data 操作完成后再去取这个 data,那么肯定会出现线程间的数据混乱问题,因为 A 线程在取 data 数据前可能 B 线程又对其进行了修改,下面写个程序来说明一下该问题: public class ThreadScopeShareData { private static int data = 0;//公共的数据 public static void main(String[] args) { for(int…
线程的创建和管理: 1.应用Thread类显式创建.管理线程 2.应用Executor创建并管理线程. 定义任务: 无返回的任务:实现Runnable接口并编写run()方法. 有响应的任务:实现Callable接口并编写call()方法. 如下的火箭发射倒计时任务: public class Lunch implements Runnable { int countDown = 9; int taskCount = 0; int rocketNum = 9; final int id = ta…
我们知道,使用 synchronized 关键字可以有效的解决线程同步问题,但是如果不恰当的使用 synchronized 关键字的话也会出问题,即我们所说的死锁.死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 下面写一个死锁的例子加深理解.先看程序,再来分析一下死锁产生的原因: public class DeadLock { public static void main(String[] args) { B…
本文将详解java中的异常和异常处理机制 异常简介 什么是异常? 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常. Java异常的分类和类结构图 1.Java中的所有不正常类都继承于Throwable类.Throwable主要包括两个大类,一个是Error类,另一个是Exception类: 错误:Error类以及他的子类的实例,代表了JVM本身的错误.包括虚拟机错误和线程死锁,一旦Error出现了,程序就彻底的挂了,被称为程序终结者:例如,JVM 内存溢出.一…
本文将详解 equals()与hashCode()方法 概述 java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类.所有的对象,包括数组,都实现了在Object类中定义的方法. equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: public…
Java中基本数据类型都有相对应的包装类 什么是装箱?什么是拆箱? 在Java SE5之前,Integer是这样初始化的 Integer i = new Integer(10); 而在从Java SE5开始就提供了自动装箱的特性,如果要生成一个数值为10的Integer对象,只需要这样就可以了: Integer i = 10; 这个过程中会自动根据数值创建对应的 Integer对象,这就是装箱. 关于boolean占用几个字节,请参考:https://www.jianshu.com/p/2f66…
Java并发基础概念 线程和进程 线程和进程都能实现并发,在java编程领域,线程是实现并发的主要方式 每个进程都有独立的运行环境,内存空间.进程的通信需要通过,pipline或者socket 线程共享进程的运行环境,创建线程更加轻量级 线程 创建线程的方式 直接创建和管理Thread对象,在需要异步任务的时候创建Thread 使用抽象线程管理器,把task交给executor执行 定义和启动线程 Thread th = new Thread(); th.start(); 暂停线程 Thread…
ThreadLocal是一个本地线程副本变量工具类. 主要用于将私有线程和该线程存放的副本对象做一个映射,各个线程之间的变量互不干扰,在高并发场景下,可以实现无状态的调用,特别适用于各个线程依赖不同的变量值完成操作的场景. 读写锁ReentrantReadWriteLock 记录线程持有的读锁数量时使用了ThreadLocal.Java并发(十):读写锁ReentrantReadWriteLock 一.ThreadLocal的核心机制 每个Thread线程内部都有一个Map,Tread类的Thr…