线程
文章平均质量分 95
程序员劝退师丶
有道无术,术尚可求也,有术无道,止于术
展开
-
并发编程之Executor线程池
1. 线程池简介1.1 线程池:“线程池”,顾名思义就是一个线程缓存,线程是稀缺资源,如果被无限制的创建,不仅会消耗系统资源,还会降低系统的稳定性,因此Java中提供线程池对线程进行统一分配、调优和监控;1.2 线程池介绍在web开发中,服务器需要接受并处理请求,所以会为一个请求来分配一个线程来进行处理。如果每次请求都新创建一个线程的话实现起来非常简便,但是存在一个问题:如果并发的请求数量...原创 2020-02-04 10:31:47 · 246 阅读 · 0 评论 -
并发编程之Unsafe魔法类详解
1. unsafe类详解Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确...原创 2020-02-03 14:58:45 · 553 阅读 · 0 评论 -
并发编程系列(十六) CyclicBarrier
从字面意思理解可以看出循环执行,通过它可以实现让一组线程等待至某个状态之后再全部同时执行。循环是因为当等待线程都被释放后,CyclicBarrier对象可以被重用栅栏是强制要求线程到达某个临界点才能执行,当都到达时,一起跳过Cyclicbarrier对象执行,1.1Cyclicbarrier类的属性 /** 对象入口的重如锁 */ private final Reent...原创 2020-01-06 17:56:08 · 222 阅读 · 0 评论 -
发编程系列(十五) 并发编程常用API(3)之ArrayBlockQueue与DelayQueue
锁和信号量是控制并发,但是CountDownLatch(倒数计数器)是提供并发(让线程一起等待到某个条件一起触发执行),个人感觉CountDownLatch在平常工作环境并不常用,最常见的场景就是开启多个线程同时执行某个任务,等所有任务执行完成后再做结果汇总;在countdownLatch出现之前都是使用join()方法来实现,但是join不够灵活,不能够满足不同场景下的需求·1.1Sy...原创 2020-01-06 14:43:52 · 280 阅读 · 0 评论 -
发编程系列(十四)并发编程常用API(2)之CountDownLatch闭锁与CyclicBarrier
主要做并发控制;控制并发提升性能Semaphore底层是基于AbstractQeuedSynchronizer来实现的所以Semaphore的数据结构也是依托于AQS的数据结构1.1Sync源码解析 /** * 内部类Sync继承自AQS */ abstract static class Sync extends AbstractQueuedS...原创 2020-01-06 10:45:33 · 541 阅读 · 0 评论 -
发编程系列(十三)并发编程常用API(1)之ReentrantLock与Semaphore
1. ReentrantLock实现了Lock接口就是一把锁//Lock源码解读public interface Lock { /** * 加锁 */ void lock(); /** * 加锁并响应中断 */ void lockInterruptibly() throws InterruptedExcept...原创 2020-01-06 09:23:18 · 835 阅读 · 0 评论 -
并发编程系列(十二)AQS同步器条件锁(Condition)加锁解锁源码解读
1.Condition接口在Lock接口中有一个newCondition方法;该方法将创建一个绑定在当前Lock对象上的Condition对象,说明Condition对象和Lock对象是对应的,一个Lock对象可以创建多个Condition对象,他们是一对多的关系;Condition接口的出现是为了扩展同步代码块中的wait/notify机制通常情况下,我们调用wait()方法,主要是因为...原创 2020-01-06 09:22:33 · 459 阅读 · 0 评论 -
并发编程系列(十一)AQS同步器共享锁加锁解锁源码解读
独占模式和共享模式的最大的不同就是在同一时刻能否有多个线程获取同步状态,独占模式:获取资源后,只有一个线程获取同步状态并执行共享模式在获取资源后,多个线程共同执行1.acquireShare()方法源码解析此方法是共享模式下线程获取资源的顶层入口,获取成功则直接返回,失败则进入等待队列,并且自旋知道获取资源为止/*** 以共享模式获取资源。忽略中断*/ p...原创 2019-12-24 10:35:04 · 404 阅读 · 0 评论 -
并发编程系列(十)AQS同步器独占锁加锁与解锁-源码解读
线程池的线程特殊是AQS的子类,通过类图可以看到无论是公平锁还是非公平锁都是依赖AbstractQueuedSynchronizer实现的;AbstractOwnableSynchronizer是AbstractQueuedSynchronizer的父类为创建可能需要所有权概念的锁和相关同步器提供了基础,首先我们膜拜下并发包大神DougLea的代码1.AbstractOwnab...原创 2019-12-24 10:25:17 · 288 阅读 · 0 评论 -
并发编程系列(九)ThreadLocal是如何解决共享变量的并发问题及源码分析
ThreadLocal:线程本地变量副本,当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供变量副本,每一个线程都可以独立地改变自己副本,而不影响其他线程所对应的副本;java.lang.ThreadLocal类方法很简洁,常用方法如下:public void set(T value)设置当前线程的线程局部变量的值 publicT get(...原创 2019-12-24 10:23:39 · 319 阅读 · 0 评论 -
线程系列(八)synchronized实现原理与应用
在多线程并发编程中synchronized一直是元老级角色,很多人都会称呼它为重量级锁。但是,随着Java SE 1.6对synchronized进行了各种优化之后,有些情况下它就并不那么重了。本文详细介绍Java SE 1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。从JVM规范中可以看到Synchonized在JVM里的实现原理,JVM基于...原创 2019-12-16 18:11:49 · 269 阅读 · 0 评论 -
线程系列(七)synchronized使用方式
Java中的每一个对象都可以作为锁。具体表现为以下3种形式。对于普通同步方法,锁是当前实例对象。 对于静态同步方法,锁是当前类的Class对象。 对于同步方法块,锁是Synchonized括号里配置的对象。synchronized使用方式分类 具体分类 锁对象 示例 修饰方法 实例方法 类的实例对象 //修饰普通方法 publi...原创 2019-12-15 10:18:31 · 172 阅读 · 0 评论 -
并发编程系列(五)volatile关键字详解
volatile的作用volatile的作用是保证共享变量的可见性,不能保证原子性,也不能保证线程安全(但是对于单个共享变量的读,写是原子性的) 可见性:如果某个线程对volatile修饰的共享变量进行更新,那么其他线程可以立刻看到这个更新; 有序性:禁止指令重排序在多线程并发编程中sychronized和volatile都扮演着重要的角色,volatile扮演者重要的角色,volati...原创 2019-12-12 22:55:01 · 386 阅读 · 0 评论 -
并发编程系列(四)之Thread类源码分析(一)
环境:JDK1.8(其他版本可供参考) 开发工具: idea其实把注释翻译一遍就可以懂个七七八八的了打开Thread类线程是程序中的执行线程。java虚拟机允许应用程序有多个线程并发执行。每个线程都有优先级。优先级较高的线程是优先于优先级较低的线程执行。每个线程也可以标记为守护进程,也可以不标记为守护进程。每个线程都有一个用于标识的名称。多个线程可能具有相同的名称。如果在未指...原创 2019-12-08 20:18:44 · 1069 阅读 · 1 评论 -
并发系列(三)线程常用的方法
线程常用的方法之sleep()sleep() 方法的作用是让当前线程暂停指定的时间(毫秒) sleep()方法只是暂时让出cpu执行权,并不释放锁 由于对象锁没有被释放,其他线程仍然无法访问这个对象 sleep()方法不需要再同步的代码块中执行,wait()方法必须在同步代码中执行 sleep()可以通过interrupt()方法打断线程的暂停状态 sleep()只是线程的操作,用于...原创 2019-12-08 19:12:22 · 308 阅读 · 0 评论 -
并发编程系列(二)之线程的中断
线程中断的概念java中线程中断是一种协作机制 通过中断并不能直接终止线程的运作 需要被中断的线程自己处理中断.每个线程都有一个boolean类型的标志位,代表线程是否中断;线程1想中断线程2,线程1只需要设置线程2的中断标识位等于true即可;线程2在合适的时候处理中断请求,甚至线程2可以选择不处理中断请求;结论:设置线程中断后,被中断的线程不是立即移除运行的线程中断的...原创 2019-12-08 14:55:43 · 323 阅读 · 0 评论 -
并发编程系列(一)创建线程的三种方式及线程如何完成上下文如何切换
1.Thread类:继承Thread类的创建方式:定义Thread类的子类,并重写该类的 run() 方法,该 run() 方法的方法体就代表了线程需要完成的任务。 创建Thread子类实例,即创建了线程的对象 调用线程对象的start() 方法来创建并启动线程。public class HelloThread extends Thread{ @Override ...原创 2019-12-08 13:22:19 · 344 阅读 · 0 评论