
重学多线程
懋为
居安思危,思则有备,有备无患,敢以此规。
展开
-
重学多线程(一)—— 线程简介
线程的定义线程有时候又被称为轻量级进程,是程序执行的最小单元。一个进程可对应多个线程,而一个线程只属于一个进程。多线程的好处资源利用率更好 一个单线程程序在运行时只能使用一个处理器核心,那么再多的处理器核心加入也无法显著提升该程序的执行效率。相反,如果该程序使用多线程技术,将计算逻辑分配到多个处理器核心上,就会显著减少程序的处理时间,并且随着更多处理器核心的加入而变得更有原创 2018-01-03 23:30:14 · 234 阅读 · 0 评论 -
Java 内存可见性
前两天面试的时候被问到 Java 内存可见性相关问题,个人感觉回答的不是很好,因此需要强化学习一下。首先什么是内存可见性呢?可见性 一个线程对共享变量值的修改,能够及时地被其他线程看到谈到内存可见性,必须得先从 Java 的内存模型(JMM)说起,下图表示了 Java 的内存模型, 整体来说,在 JMM 中,所有的变量都存储在主内存中,而每个线程都有自己独立的工作内...原创 2018-06-13 15:44:28 · 464 阅读 · 0 评论 -
重学多线程(九)—— 再谈锁机制
前言《重学多线程(三)—— 锁》一文比较详细地介绍了 Java 中的所机制,博主最近在工作中使用锁时,经常思考几个问题——公平锁和非公平锁如何具体实现、ReentrantLock 默认情况下是否公平、共享锁和排它锁具体如何实现,现在正好有时间重新梳理一下这块内容。锁的基础知识我们日常开发过程中提到的锁,一般指的是实现了 java.util.concurrent.locks 包中 Loc...原创 2018-05-15 01:09:47 · 295 阅读 · 0 评论 -
重学多线程(八)—— ThreadLocal
ThreadLocal介绍在日常开发中,一个线程在其声明周期内,可能穿过多个层级,多个方法,如果有个对象需要在此线程周期内多次调用,且是跨层级的(线程内共享),通常的做法是通过参数进行传递,那有没有更好的方法呢?显然是有的,那就是ThreadLocal。ThreadLocal将变量绑定在线程上,在一个线程周期内,无论“你身处何地”,只需通过其提供的get方法就可轻松获取到对象,极大地提高了...原创 2018-04-23 23:26:21 · 232 阅读 · 0 评论 -
重学多线程(七)—— 并发框架类
前言java.concurrent包提供了几个非常实用的并发工具类,这些工具类提供了一种非常有效的并发流程控制手段。CountDownLatchCountDownLatch 允许一个或多个线程等待其他线程完成操作。CountDownLatch的具体实现如下:public class CountDownLatch { private static final class S...原创 2018-04-22 02:08:06 · 240 阅读 · 0 评论 -
重学多线程(五)—— Unsafe类
前言java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:通过Unsafe类可以分配内存,可以释放内存;可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的;挂起与恢复线程;CAS操作。分配和释放内存 //分配内存 public native long allocateM...原创 2018-01-12 01:27:23 · 692 阅读 · 0 评论 -
重学多线程(六)—— 原子操作类
前言对于i++这种线程不安全的操作,我们一般使用synchronized关键字来解决此类问题,JDK1.5开始提供了Atomic包,这个包中的原子操作类提供了一种快速高效同时又线程安全的更新变量的方式。基本类型在JDK1.6中,Atomic包里一共有12个类,具体如下图所示: 这些原子操作类按照类型可以分为:原子更新基本类型原子更新数组原子更新引用原子更新字段...原创 2018-02-22 16:38:19 · 226 阅读 · 0 评论 -
重学多线程(四)—— 线程池
前言Java中的线程池是运用场景最多的并发框架,合理的使用线程池能够有如下好处:降低资源消耗 通过重复利用已创建的线程降低线程创建和销毁造成的消耗;提高响应速度 当任务到达时,任务可以不需要等到线程创建就能立即执行;提高线程的可管理性 线程是稀缺资源,使用线程池可以进行统一分配、优化和监控;ThreadPoolExecutor类public ThreadPoo原创 2018-01-08 22:24:31 · 226 阅读 · 0 评论 -
重学多线程(三)—— 锁
前言锁是用来控制多个线程访问共享资源的方式。在Lock接口出现之前,Java程序是靠synchronized关键字实现锁功能,虽然Lock在使用时多了显式地获取和释放,但是却拥有了锁获取与释放的可操作性、可中断的获取锁以及超时获取锁等多种synchronized关键字不具备的同步特性。Lock的API接口//Lock是一个接口,接口,接口!重要的事情说三遍。public in原创 2018-01-06 14:45:32 · 347 阅读 · 0 评论 -
重学多线程(二)—— 线程间的通信
前言一般而言,一个线程往往不是孤立存在的,常常需要和其它线程通信,以执行特定的任务。线程与线程间必定有一个信息传递的渠道。这种线程间的通信不但是难以避免的,而且在多线程编程中也是复杂和频繁的。线程间的通信涉及到4个问题:线程间如何传递信息线程间如何同步线程间如何调度如何避免死锁在Java多线程编程环境下,我们一般采用如下两种方式:使用synchronized和volat原创 2018-01-04 22:57:10 · 231 阅读 · 0 评论 -
重学多线程(十)—— synchronized 原理与锁升级
前言前几天去面试的时候,面试官问了一些关于 synchronized 关键字原理性的问题,回答得不甚理想。看来,平时对synchronized关键只能做到知其然,却不知其所以然,所以利用业余时间补习一下。synchronized 原理synchronized 关键字编译后会在同步块的前后添加上 montorenter 和 monitorexit 两个字节码指令,这两个字节码指令都需...原创 2018-06-02 15:48:38 · 4781 阅读 · 0 评论