随笔分类 - 多线程高并发
摘要:在分析ThreadLocal方法的时候,我们了解到ThreadLocal的操作实际上是围绕ThreadLocalMap展开的。ThreadLocalMap的源码相对比较复杂, 我们从以下三个方面进行讨论。 基本结构 ThreadLocalMap是ThreadLocal的内部类,没有实现Map接口,用
阅读全文
摘要:基于ThreadLocal的内部结构,我们继续分析它的核心方法源码,更深入的了解其操作原理。除了构造方法之外, ThreadLocal对外暴露的方法有以下4个 set方法 (1 ) 源码和对应的中文注释 /** * 设置当前线程对应的ThreadLocal的值 * * @param value 将要
阅读全文
摘要:回顾概念 我们先来回顾这个问题中涉及的几个名词概念,再来分析问题。 内存泄漏相关概念 内存泄露 (memory leak),是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。 是指你向系统申请分配内存进行使用(new),
阅读全文
摘要:ThreadLocal的实现原理 Thread类中有threadLocals和inheritableThreadLocals两个变量,它们都是ThreadLocalMap类型的变量. 其实每个线程的本地变量不是存放在ThreadLocal实例(对象)里面,而是存放在调用线程的threadLocals
阅读全文
摘要:什么是ThreadLocal? 官方介绍 /** * This class provides thread-local variables. These variables differ from * their normal counterparts in that each thread tha
阅读全文
摘要:在《深入理解Java虚拟机中》关于Java堆内存有这样一段对逃逸分析的描述: 那么究竟怎么理解逃逸分析?我们先来看一个例子 运行期优化示例 两层循环,内层循环创建1000次对象,外层循环对内层循环进行计时统计。 public class JIT1 { public static void main(
阅读全文
摘要:本篇内容为线程专题 -- 线程的创建,状态,工作过程中的部分内容。 在项目实践中经常会遇到一个场景,就是需要等待某几件事情完成后才能继续往下执行,比如多个线程加载资源,需要等待多个线程全部加载完毕再汇总处理。Thread类中有一个join方法就可以做这个事情, join方法则是Thread类直接提供
阅读全文
摘要:Runnable 的缺陷 (1)不能拿到任务的返回结果 第一个缺陷,对于 Runnable 而言,不能拿到任务的返回结果,虽然可以利用其他的一些办法,比如在 Runnable 方法中写入日志文件或者修改某个共享的对象的办法,来达到保存线程执行结果的目的,但这种解决问题的行为效率着实不高。 实际上,在
阅读全文
摘要:本篇内容为线程专题 -- 线程的创建,状态,工作过程中的线程创建方式的部分内容。 JAVA中有三种线程创建的方式: (1)实现Runnable接口的run方法。 (2)继承Thread类并重写run的方法。 (3)使用FutureTask方式(实现Callable接口的方式)。 说明:在《Java并
阅读全文
摘要:线程安全? 《Java并发编程实战(Java Concurrency In Practice)》的作者Brian Goetz为“线程安全”做出了一个比较恰当的定义:“当多个线程同时访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协
阅读全文
摘要:什么是线程池? 线程池是为了避免线程频繁的创建和销毁带来的性能消耗,而建立的一种池化技术,它是把已创建的线程放入“池”中,当有任务来临时就可以重用已有的线程,无需等待创建的过程,这样就可以有效提高程序的响应速度。 为什么要使用它?使用线程池有什么好处? 如果不用线程池,每个任务都创建一个线程会带来问
阅读全文
摘要:如何实现线程安全与代码编写有很大的关系,但虚拟机提供的同步和锁机制也起到了至关重要的作用。 1.互斥同步(阻塞同步) 互斥同步(Mutual Exclusion & Synchronization)是一种最常见也是最主要的并发正确性保障手 段。同步是指在多个线程并发访问共享数据时,保证共享数据在同一
阅读全文
摘要:进程和线程的关系? 线程是进程中的一个实体,线程本身是不会独立存在的。进程是操作系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。操作系统在分配资源时是把资源分配给进程的,但是CPU比较特殊,它是分配给线程的,因为真正要占用CPU
阅读全文
摘要:CAS (Compare and Swap),比较并交换 ,是线程安全实现方式--非阻塞同步的方式,它体现的一种乐观锁的思想。 《深入理解Java虚拟机:JVM高级特性与最佳实践(第3版) 周志明》一书中的描述如下: 实例 比如多个线程要对一个共享的整型变量执 行 +1 操作: 获取共享变量时,为了
阅读全文
摘要:JVM 内存结构、Java 内存模型,这是两个截然不同的概念,但是很容易混淆。我们就先从整体上概括一下这两者的主要作用: JVM 内存结构和 Java 虚拟机的运行时区域有关; Java 内存模型和 Java 的并发编程有关。 为什么需要 JMM(Java Memory Model,Java 内存模
阅读全文
摘要:谈谈你对锁的理解? 在并发编程中有两个重要的概念:线程和锁 多线程是一把双刃剑,它在提高程序性能的同时,也带来了编码的复杂性。 锁的出现就是为了保障多线程在同时操作一组资源时的数据一致性,当我们给资源加上锁之后,只有拥有此锁的线程才能操作此资源,而其他线程只能排队等待使用此锁。 你知道哪几种锁?分别
阅读全文
摘要:高效并发是从JDK 5升级到JDK 6后一项重要的改进项,HotSpot虚拟机开发团队在这个版本上花费了大量的资源去实现各种锁优化技术,如适应性自旋(Adaptive Spinning)、锁消除(Lock Elimination)、锁膨胀(Lock Coarsening)、轻量级锁(Lightwei
阅读全文
摘要:学习完本文,你将能回答如下问题: (1) synchronied修饰静态方法和对象有什么不同?(碧桂园2面) (2)说说对于 synchronized 关键字的了解?synchronied关键字可以修饰什么?(YY一面) (3) JDK 1.6 时锁做了哪些优化(锁升级)? synchronied关
阅读全文
摘要:幂等性最早是数学里面的一个概念,后来被用于计算机领域,用于表示任意多次请求执行的结果均与一次请求执行的结果相同,对于一个接口而言,即无论调用多少次,最终得到的结果都是一样的,用数学语言表达就是f(x)=f(f(x))。 如何保证幂等性? (1) 前端拦截 (2) 使用数据库实现幂等性 (3) 使用
阅读全文
摘要:单例模式 作用:如果一个全局使用的类需要频繁地创建与销毁,那么我们可以用单例模式来减少内存的开销。 定义:一个类有且仅有一个实例,并且自行实例化向整个系统提供。”比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。 要点:一单例类只能有一个实例;二是它必须自行创建这个实例;三
阅读全文