CAS

线程池 ThreadPoolExecutor 原理及源码笔记

半城伤御伤魂 提交于 2021-01-22 15:30:42
前言 " 前面在学习 JUC 源码时,很多代码举例中都使用了线程池 ThreadPoolExecutor ,并且在工作中也经常用到线程池,所以现在就一步一步看看,线程池的源码,了解其背后的核心原理。 " 1 介绍 什么是线程池 " 线程池(英语:thread pool :一种线程使用模式。线程过多会带来调度开销,进而影响缓存局部性和整体性能。而线程池维护着多个线程,等待着监督管理者分配可并发执行的任务。这避免了在处理短时间任务时创建与销毁线程的代价。线程池不仅能够保证内核的充分利用,还能防止过分调度。可用线程数量应该取决于可用的并发处理器、处理器内核、内存、网络sockets等的数量。 —— 维基百科 为什么要使用线程池 降低资源消耗:通过池化技术重复利用已创建的线程,降低线程创建和销毁造成的损耗。 提高响应速度:任务到达时,无需等待线程创建即可立即执行。 提高线程的可管理性:线程是稀缺资源,如果无限制创建,不仅会消耗系统资源,还会因为线程的不合理分布导致资源调度失衡,降低系统的稳定性。使用线程池可以进行统一的分配、调优和监控。 如何使用线程池 线程池使用有很多种方式,不过按照《Java 开发手册》描述,尽量还是要使用 ThreadPoolExecutor 进行创建。 代码举例: ExecutorService pool = new ThreadPoolExecutor( 5 ,

单点登录的三种实现方式

人走茶凉 提交于 2021-01-22 15:30:02
转自: 张永恒 cnblogs.com/yonghengzh/p/13712729.html 前言 实现方式一:父域 Cookie 实现方式二:认证中心 实现方式三:LocalStorage 跨域 补充:域名分级 前言 在 B/S 系统中,登录功能通常都是基于 Cookie 来实现的。当用户登录成功后,一般会将登录状态记录到 Session 中,或者是给用户签发一个 Token,无论哪一种方式,都需要在客户端保存一些信息(Session ID 或 Token ),并要求客户端在之后的每次请求中携带它们。 在这样的场景下,使用 Cookie 无疑是最方便的,因此我们一般都会将 Session 的 ID 或 Token 保存到 Cookie 中,当服务端收到请求后,通过验证 Cookie 中的信息来判断用户是否登录 。 单点登录(Single Sign On, SSO)是指在同一帐号平台下的多个应用系统中,用户只需登录一次,即可访问所有相互信任的应用系统。 举例来说,百度贴吧和百度地图是百度公司旗下的两个不同的应用系统,如果用户在百度贴吧登录过之后,当他访问百度地图时无需再次登录,那么就说明百度贴吧和百度地图之间实现了单点登录。 单点登录的本质就是在多个应用系统中共享登录状态。如果用户的登录状态是记录在 Session 中的,要实现共享登录状态,就要先共享 Session,比如可以将

Java并发编程--ReentrantReadWriteLock

落爺英雄遲暮 提交于 2021-01-18 16:26:29
概述   ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好的并发性和吞吐量。   读写锁内部维护了两个锁,一个用于读操作,一个用于写操作。所有 ReadWriteLock实现都必须保证 writeLock操作的内存同步效果也要保持与相关 readLock的联系。也就是说,成功获取读锁的线程会看到写入锁之前版本所做的所有更新。   ReentrantReadWriteLock支持以下功能:     1)支持公平和非公平的获取锁的方式;     2)支持可重入。读线程在获取了读锁后还可以获取读锁;写线程在获取了写锁之后既可以再次获取写锁又可以获取读锁;     3)还允许从写入锁降级为读取锁,其实现方式是:先获取写入锁,然后获取读取锁,最后释放写入锁。但是,从读取锁升级到写入锁是不允许的;     4)读取锁和写入锁都支持锁获取期间的中断;     5)Condition支持。仅写入锁提供了一个

深入浅出Java并发包—CountDownLauch原理分析

时间秒杀一切 提交于 2021-01-17 10:35:31
深入浅出Java并发包—CountDownLauch原理分析 一线天色天宇星辰 IT哈哈 CountDownLauch是Java并发包中的一个同步工具集,常被人们称之为并发中的计数器,还有一种被成为闭锁! CountDownLauch主要使用在两种场景,一种被称为开关,它允许一个任务完成之前,一个或一组线程持续等待。此种情况经常被称之为闭锁,通俗的讲就是,相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开,所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态。另一种场景经常被称之为计数器,它允许将一个任务拆分为N个小任务,主线程在所有任务完成之前一直等待,每个任务完成时将计数器减一,直到所有任务完成后取消主线程的阻塞。 我们来看一下对应CountDownLauch对应的API。 CountDownLatch维护了一个正数计数器,countDown方法对计数器做减操作,await方法等待计数器达到0。所有await的线程都会阻塞直到计数器为0或者等待线程中断或者超时。 我们分别来看一下对应的一个应用实例: package com.yhj.lauth; import java.util.Date; import java.util.concurrent.CountDownLatch; //工人 class

java面试题总结系列(多线程)

回眸只為那壹抹淺笑 提交于 2021-01-15 05:26:54
什么是进程,什么是线程? 进程是操作系统分配资源的最小单元,线程是操作系统调度的最小单元。 线程包含在进程当中,是进程中实际运行单位。 java实现多线程的几种方式,应该使用哪种方式比较好?   (1)继承 java.lang.Thread 类   (2)实现 java.lang.Runnable 接口   如果你要继承其他类,最好实现Runnable。 Thread类中的Start() 和run() 方法的区别? start()方法是用来启动新创建的线程,而start()内部调用的run(),如果直接调用run(),则是在原来的线程中运行的。 Runnable和Callable有什么不同? Callable的 call() 方法可以返回值和抛出异常,而Runnable的run()方法没有这些功能。Callable可以返回装载有计算结果的Future对象。 Runnable可以作为Thread构造器的参数,通过开启新的线程来执行,也可以通过线程池来执行。而Callable只能通过提交给线程池ExecutorService执行。 CountDownLatch、CyclicBarrier和Semaphore    1)CountDownLatch和CyclicBarrier都能够实现线程之间的等待,只不过它们侧重点不同:    

英特尔傲腾DC P4800X有哪些适用场景?

点点圈 提交于 2021-01-15 05:26:25
英特尔傲腾(Optane)既有消费级产品,也有企业级数据中心专用的产品,其实就是P4800X系列。 从官方介绍的数据来看,与3D NAND的DC P3700相比,DCP4800X在较低队列深度下的读写性能表现,读写响应时间,QoS等方面都有很大优势。 Optane的应用定位比较特殊:既能跟普通的3D NAND站在一个队伍,组成快存储和Cache方案。也能跟DRAM站在一块组成内存池,作为扩展内存。如下图所示: “Optane作用SSD” 我们先来看Optane用作变异版的SSD的场景。之所以说是变异版,是因为Optane的一些特性能秒杀NAND SSD,其中以稳定性和低延迟最令人印象深刻,这点非常企业级。 当用作快存储的时候,简单说就是加速。作为数据库,对性能最直接的要求就是TPM更高,多用户多线程下的高TPM是数据库的最基础的要求。英特尔用DC P3700和DC P4800X做了一个对比实验(除了硬盘以外,别的全一样),用Sysbench给出OLTP压力,做出的测试结果如下图。 横坐标是线程数,从单线程开始到64线程结束,左侧纵坐标是TPS(每秒的事务数),右侧纵坐标是延迟(时延)。随着线程数增长,TPS都在快速增长,当达到64线程的时候P4800X的TPS能达到16k以上,而P3700也有12kTPS,直观来看,差距是在不断拉大的,P4800X的优势不难发现。 这点展现出DC

100道Java并发和多线程基础面试题大集合(含解答),这波面试稳了~

删除回忆录丶 提交于 2021-01-14 17:59:19
# 前言 这篇文章主要是对多线程的问题进行总结的,因此罗列了100个多线程的问题。 这些多线程的问题来源于各大网站,可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所有的问题都会按照自己的理解回答一遍,不会去看网上的答案,因此可能有些问题讲的不对,能指正的希望大家不吝指教。 整理了一份Java面试宝典完整版PDF # 100个问题汇总 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回答更扯淡。所谓"知其然知其所以然","会用"只是"知其然","为什么用"才是"知其所以然",只有达到"知其然知其所以然"的程度才可以说是把一个知识点运用自如。OK,下面说说我对这个问题的看法: (1)发挥多核CPU的优势 随着工业的进步,现在的笔记本、台式机乃至商用的应用服务器至少也都是双核的,4核、8核甚至16核的也都不少见,如果是单线程的程序,那么在双核CPU上就浪费了50%,在4核CPU上就浪费了75%。单核CPU上所谓的"多线程"那是假的多线程,同一时间处理器只会处理一段逻辑,只不过线程之间切换得比较快,看着像多个线程"同时"运行罢了。多核CPU上的多线程才是真正的多线程,它能让你的多段逻辑同时工作,多线程,可以真正发挥出多核CPU的优势来,达到充分利用CPU的目的。 (2)防止阻塞

线程安全性详解(原子性、可见性、有序性)

廉价感情. 提交于 2021-01-14 15:59:01
一、定义:什么是线程安全性 当多个线程访问某个类时,不管运行时环境采用 何种调度方式 或者这些进程将如何交替执行,并且在主调代码中 不需要任何额外的同步或协同 ,这个类都能表现出 正确的行为 ,那么就称这个类就是线程安全的。 二、线程安全性的三个体现 原子性 :提供互斥访问,同一时刻只能有一个线程对数据进行操作(Atomic、CAS算法、synchronized、Lock) 可见性 :一个主内存的线程如果进行了修改,可以及时被其他线程观察到(synchronized、volatile) 有序性 :如果两个线程不能从 happens-before原则 观察出来,那么就不能观察他们的有序性,虚拟机可以随意的对他们进行重排序,导致其观察观察结果杂乱无序(happens-before原则) 三、线程安全性:原子性 3.1、原子性 — Atomic包 在Java jdk中里面提供了很多Atomic类 AtomicXXX:CAS、Unsafe.compareAndSwapInt AtomicLong、LongAdder AtomicReference、AtomicReferenceFieldUpdater AtomicStampReference:CAS的ABA问题 由于CAS原语的直接操作与计算机底层的联系很大,CAS原语有三个参数, 内存地址 、 期望值 、 新值

详谈分布式最终一致性

北慕城南 提交于 2021-01-14 13:34:59
“什么是分布式系统?这取决于看系统的角度。对于坐在键盘前使用IBM个人电脑的人来说,电脑不是一个分布式的系统。但对于在电脑主板上趴着的虫子来说,这台电脑就是一个分布式系统。” —— Leslie Lamport 引言 分布式一致性问题随处可见,任何一个实体/联接模型,都可能存在分布式一致性问题。如果把单机拆开来看,CPU、内存、I/O设备组成的机箱本身就是一个小型的分布式系统,需要确保对这个系统操作的最终一致性。幸运的是这部分工作已经交给操作系统和数据库软件来帮我们完成。而在大型分布式企业级应用中,分布式最终一致性方案需要根据系统自身特点量身定制,是系统设计的重点。近年来随着沪江业务的快速增长和微服务治理推广,本地ACID事务早已不能满足业务和系统的发展需求。大部分业务流程都需要跨多微服务的调用来协作完成,并且要求系统确保分布式最终一致性。 可以选择分布式事务框架方案,目前主流的分布式事务框架大致可分为3类实现 : 基于XA协议的两阶段提交(2PC)方案 基于支付宝最早提出的TCC(Try、Confirm、Cancel)方案 基于ebay最早提出的消息队列异步确保方案 此外还有较轻的解决方案,业务系统可以根据自身需要,选择通过幂等/重试、状态机、恢复日志、异步校验等技术来确保最终一致性。 重型武器 采用分布式事务框架的方案,最终一致性由分布式事务框架保证

Introduction to All Functions & Features of Brand

大城市里の小女人 提交于 2021-01-14 12:45:53
WHAT IS KEY TOOL PLUS? Xhorse KEY TOOL PLUS Tablet is a professional locksmith tool that integrates the main functions of remote control and chip, anti-theft matching, programming, accessory replacement, maintenance reset, etc., and also reserves future expansion capabilities. One device can solve all the needs of daily work. Key Tool Plus is Xhorse new realesed, first tablet key tool, much easier to complete various automotive programming anywhere with no need to take your laptop, mobile phone. It supports IMMO programming for luxury cars like BMW, BENZ, AUDI, and VW. Besides, it's available