自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

诸般世界

知识改变命运,技术改变世界。

  • 博客(32)
  • 收藏
  • 关注

原创 001 redis基础-redis特性

Redis特性:•速度快:官方给出10万QPS,即每秒可以进行10万次读写操作,其为理想化;实际应用工作中,万级QPS是没有问题,具体要看使用方法与应用的数据结构;1.数据不落地,直接存储在内存中;2.使用C语言开发,只有5到6万行代码;3.redis的线程模式是单线程(数据存储内存中,使用单线程效率高,多线程会操作内存瓶颈,线程间切换会浪费过多资源);•持久化:rides数据...

2019-06-30 12:41:16 120

原创 005 AQS-锁优化

•1 避免死锁•2 减小锁的持有时间•3 减小锁的粒度•4 锁的分离•5 尽量使用无锁的操作,如原子操作(Atomic系列类),volatile关键字AQS-源码分析-acquire(int)•acquire(int):(公平锁的实现) 此方法是独占模式下线程获取共享资源的顶层入口。如果获取到资源,线程直接返回,否则进入等待队列,直到获取到资源为止,且整个...

2019-06-27 15:44:08 108

原创 004 AQS核心-LockSupport的使用

LockSupport提供park()和unpark()方法实现阻塞线程和解除线程阻塞,实现的阻塞和解除阻塞是基于”许可(permit)”作为关联,permit相当于一个信号量(0,1),默认是0. 线程之间不再需要一个Object或者其它变量来存储状态,不再需要关心对方的状态。 LockSupport不需要在同步代码块里 。所以线程间也不需要维护一个共享的同步...

2019-06-27 15:06:35 232

原创 003 AQS核心-ReentrantReadWriteLock对象锁的使用

读写锁ReentrantReadWriteLock,其核心就是实现读写分离的锁。在高并发访问下,尤其是读多写少的情况下,性能要远高于重入锁。 之前学synchronized、ReentrantLock时,我们知道,同一时间内,只能有一个线程进行访问被锁定的代码,那么读写锁则不同,其本质是分成两个锁,即读锁、写锁。在读锁下,多个线程可以并发的进行访问,但是在写锁的时...

2019-06-27 14:34:49 162

原创 002 AQS核心-Condition条件判断的使用

我们在使用synchronized的时候,如果需要多线程间进行协作工作则需要Object的wait()和notify()、notifyAll()方法进行配合工作。 那么同样,我们在使用Lock的时候,可以使用一个新的等待/通知的类,它就是Condition。这个Condition一定是针对具体某一把锁的。也就是在只有锁的基础之上才会产生Condition。 ...

2019-06-27 14:11:21 313

原创 001 AQS核心-ReentrantLock使用与底层代码深度分析

谈到并发,不得不谈ReentrantLock;而谈到ReentrantLock,不得不谈AbstractQueuedSynchronizer (AQS);类如其名,抽象的队列式的同步器,AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,比如我们之前的课程上讲到的: ReentrantLock/Semaphore/CountDownLatch; ...

2019-06-27 11:52:11 218

原创 004 线程池核心-如何正确使用线程池

线程池应用不好会直接影响并发性能,致使性能无法提升,同时还会影响服务的稳定性;合理使用线程池:•第一点,线程个数大小的设置•第二点,线程池相关参数配置•第三点,利用Hook嵌入你的行为•第四点,线程池的关闭线程个数大小的设置:首先,我们要知道 计算机密集型和IO密集型这两个概念!计算密集型: 顾名思义就是应用需要非常多的CPU...

2019-06-26 20:20:00 278

原创 003 线程池核心-ThradPoolExecutor自定义线程池

•自定义线程池:若Executors工厂无法满足我们的需求,可以自己创建自定义线程池,其实Executors工厂类里面的创建线程方法其内部实现均是用了ThreadPoolExecutor这个类,这个类可以自定义线程。构造方法如下:•队列类型参数选择:•在使用有界队列时,若有新的任务需要执行,如果线程池实际线程数小于corePoolSize,则优先创建线程,若大于corePoolSize...

2019-06-26 15:20:21 205

原创 002 线程池核心-Executors线程工厂类

为了更好的控制多线程,JDK提供了一套线程框架Executors,帮助开发人员有效地进行线程控制。它们都在java.util.concurrent包中,是JDK并发包的核心。Executors,他扮演这线程工厂的角色,我们通过Executors可以创建特定功能的线程池。Executors创建线程池方法:•newFixedThreadPool()方法:该方法返回一个固定数...

2019-06-26 13:53:50 228

原创 001 线程池核心-线程池作用

线程池,一说到这个词,大家很容易想到高并发等等各种脑补的场景。高并发其实是一个非常抽象的概念,要实现高并发其实不仅仅是一个JAVA 线程集合类、或者JAVA基础层面就能搞定的事情,在互联网大厂中,高并发其实涉及方方面面,从前端到后端,到支持高并发的中间组件,最后到数据存储,持久化层面等等,都需要对高并发做一些考量和设计,这也是我们后面专门开设高并发全面深入集训营的目标,就是为了让同...

2019-06-26 12:02:12 384

原创 008-J.U.C工具 Semaphore信号量与限流策略

Semaphore信号量非常适合高并发访问限制,新系统在上线之前,要对系统的访问量进行评估,当然这个值肯定不是随便拍拍脑袋就能想出来的,是经过以往的经验、数据、历年的访问量,已经推广力度进行一个合理的评估,当然评估标准不能太大也不能太小,太大的话投入的资源达不到实际效果,纯粹浪费资源,太小的话,某个时间点一个高峰值的访问量上来直接可以压垮系统。相关概念:•PV(page v...

2019-06-26 10:41:17 125

原创 007 设计模式-Master-Worker整体设计思路

Master-Worker模式是常用的并行计算模式。它的核心思想是系统由两类进程协作工作:Master进程和Worker进程。 Master负责接收和分配任务,Worker负责处理子任务。当各个Worker子进程处理完成后,会将结果返回给Master,由Master做归纳和总结,其好处是能将一个大任务分解成若干个小任务,并行执行,从而提高系统的吞吐量。Ma...

2019-06-24 18:45:09 124

原创 006 J.U.工具-Forkjoin并行框架

Fork/Join框架是JAVA7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。关键点:1.在什么情况下进行任务的拆分,即执行fork操作?Fork/Join中两个重要的类:1.ForkJoinTask:使用该框架,需要创建一个ForkJoin任务,它提供在任务中执行fork和join操作...

2019-06-23 09:07:25 127

原创 005 J.U.CExchanger线程数据交换器

Exchanger用于进行线程间的数据交换,它提供一个同步点,在这个同步点,两个线程可以交换彼此的数据; 两个线程通过exchange方法交换数据,如果一个线程先执行exchange方法,它会一直等待第二个线程也执行exchange方法,当两个线程都达到同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方。使用场景:1.遗传算法:遗传算法里需要选出两个人作为...

2019-06-21 20:01:44 105

原创 004 利用设计模式模拟Future

Future模式有点类似于商品订单。比如在网购时,当看重某一件商品事,就可以提交订单,当订单处理完成后,在家里等待商品送货上门即可。或者说更形象的我们发送Ajax请求的时候,页面是异步的进行后台处理,用户无须一直等待请求的结果,可以继续浏览或操作其他内容。Futrue运行图解://最上层接口public interface Data { //接口方法,获取请求结果...

2019-06-21 13:59:52 155

原创 003 Future与caller回调

Future模式,也是非常经典的设计模式,这种模式主要就利用空间换时间的概念,也就是说异步执行(需要开启一个新的线程),在互联网高并发的应用服务中,我们随处可见这种理念和代码,主要就是使用了这种模式;Future模式非常适合在处理很耗时很长的业务逻辑时进行使用,可以有效的减小系统的响应时间,提高系统的吞吐量!【吞吐量:即每秒钟可以承载的请求数量。】/* 异步执行的任务,封装成一...

2019-06-21 10:07:53 198

原创 002 J.U.C工具类-CyclicBarrier

CyclicBarrier:栅栏的概念,多线程的进行阻塞(即阻塞多个线程),等待某一个临界值条件满足后,同时执行!假设有只有的一个场景:每个线程代表一个跑步运动员,当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待!/*假设有只有的一个场景:每个线程代表一个跑步运动员,* 当运动员都准备好后,才一起出发,只要有一个人没有准备好,大家都等待!**/pub...

2019-06-21 00:22:04 250

原创 001J.U.C工具类-CountDownLatch

CountDownLatch: 用于监听某些初始化操作,并且线程进行阻塞,等初始化执行完毕后,通知主线程继续工作执行。 CountDownLatch可以代替wait()和notify(); CountDownLatch可以去做一下监控操作,经常应用场景为程序在做准备工作的过程中,主程序是要继续向下进行,可以用于阻断主程序监听准备完成后继续执行;...

2019-06-20 22:45:27 127

原创 006JDK Unsafe类使用与CAS原子特性

由于java不能直接访问操作系统底层,而是通过本地方法来访问。Unsafe类提供了硬件级别的原子操作,主要提供了以下功能:•内存操作•字段的定位与修改•挂起与恢复•CAS操作(乐观锁)1.内存操作: 类中提供的3个本地方法allocateMemory、reallocateMemory、freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个...

2019-06-20 22:05:12 303

原创 005Atomic系列类

Atomic系列类封装了一系列的基础类型和对象操作,其主要目的就是为了实现原子性,可以在高并发时保障线程安全,主要核心类如下:•AtomicInteger•AtomicLong•AtomicBoolean•AtomicIntegerArray•AtomicLongArray•AtomicReferencepublic class UseAtomic { ...

2019-06-20 16:55:14 110

原创 004Volatile关键字

Volatile概念:Volatile关键字的主要作用是使变量在多个线程间可见。作用:1.在多线程间可以进行变量的变更,使得线程间进行数据的共享可见。2.阻止指令重排序,happens-beforepublic class UseVolatile extends Thread{ //为isRunning加上volatile关键字修饰,实现线程通讯过程中的数据共享...

2019-06-20 09:33:04 81

原创 003 Synchronized及线程通信

同步:synchronized 同步的概念就是共享,我们要牢牢记住"共享"这俩个字,如果不是共享的资源,就没有必要进行同步。同步的目的就是为了线程安全,其实对于线程安全来说,需要满足俩个特性:原子性(同步),可见性。异步:asynchronized 异步的概念就是独立,相互之间不受到任何制约。就好像我们学习http的时候,在页面发起的Ajax请求,我们还可以...

2019-06-20 08:51:44 127

原创 002ThreadLocal概念

ThreadLocal线程局部变量,是一种多线程间并发访问变量的解决方案。与其synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以保障线程安全。 从性能上说,ThreadLocal不具有绝对的优势,在并发不是很高的时候,加锁的性能会更好,但作为一套与锁完全无关的线程安全解决方案,在...

2019-06-19 15:18:11 157

原创 001线程安全

线程安全概念:当多个线程访问某一个类(对象或方法)时,这个类始终都能表现出正确的行为,那么这个类(对象或方法)就是线程安全的。 synchronized:可以在任意对象及方法上加锁,而加锁的这段代码称为“互斥区”或“临界区”。 当多个线程访问myThread的run方法时,以排队的方式进行处理(这里排对是按照CPU分配的先后顺序而定的),一个线程...

2019-06-19 15:06:25 84

原创 007并发容器类-DelayQueue

DelayQueue(无界队列):带有延迟时间的Queue其中的元素只有当其指定的延迟时间到了,才能够从队列中获取到该元素。DelayQueue中的元素必须实现Delayed接口,DelayQueue是一个没有大小限制的队列,应用场景很多,比如对缓存超时的数据进行移除、 任务超时处理、空闲连接的关闭等等。/** 网民类作为DelayQueue的元素,必须实现Delayed接口*/...

2019-06-19 14:48:20 87

原创 006并发容器类-PriorityBlockingQueue

PriorityBlockingQueue基于优先级的阻塞队列优先级的判断通过构造函数传入的Compator对象来决定,也就是说传入队列的对象必须实现Comparable接口,实现的目的在于做一个大小的比较,在出队列的时候有一个先后的顺序,所有它并不遵循先进先出原则,按照自己定义(算法)的顺序,在实现PriorityBlockingQueue时,内部控制线程同步的锁采用的是公平锁,他也是一个无...

2019-06-19 14:41:18 100

原创 005并发容器类-BlockingQueue接口

ConcurrentLinkedQueue(无界队列)://1.高性能的无阻塞无界队列ConcurrentLinkedQueue //无界队列不用定义长度 ConcurrentLinkedQueue<String> clq = new ConcurrentLinkedQueue(); //添加元素有两种方法offer...

2019-06-19 14:30:39 90

原创 004阻塞Queue模拟

模拟要点:1.什么事阻塞队列?如何进行模拟一个阻塞队列?2.拥有固定长度承载元素的容器。3.计数统计容器的容量大小。4.当队列里面没有元素的时候执行线程要等待。5.单队列元素已满的时候执行线程也需要等待。//模拟阻塞Queue(队列)public class MyQueue { //1,定义队列的承载容器 private final LinkedList&...

2019-06-19 13:01:40 99

原创 003并发容器类-并发Queue接口

JDK提供两套并发队列实现,一个是ConcurrentLinkedQueue为代表的高性能队列,另一个是以BlockingQueue接口为代表的阻塞队列,他们都继承自Queue接口;ConcurrentLinkedQueue(线程安全的无界无阻塞队列):是一个适合高并发场景下的队列,通过无锁的方式,实现了高并发状态下的高性能,通常ConcurrentLinkedQueue性能好于Block...

2019-06-19 12:32:27 95

原创 002并发容器类-CopyOnWrite

CopyOnWrite容器即写时复制容器。 当向一个容器添加元素的时候,并不直接向当前容器添加,而是先将当前容器进行Copy,复制出一个新的容器,然后向新容器添加元素,添加完成后将原容器的引用指向新容器;此种操作的好处在于可以对CopyOnWrite容器进行并发读,而且不需要加锁,因为当前容器不会添加任何元素,所有CopyOnWrite容器也是一种读写分离的思想,...

2019-06-19 12:01:27 104

原创 001并发类容器概念

JDK5.0以后提供了多种并发类容器来替代同步类容器,从而改善性能;同步类容器的状态都是串行化的,如有大量请求访问应用服务,如果使用同步类容器或者是synchronized、或者是Object锁的方式,同一时间只有一个请求会被放行执行具体的业务代码,执行后会释放锁,剩余的大量请求会出现锁竞争,谁获得就执行后续的业务处理,“锁竞争”会严重影响应用程序效率和致使CPU使用率过高。Concurr...

2019-06-19 10:28:55 100

原创 引子:传统同步类容器及典型ConcurrentModificationException异常

同步类容器(Vector、HashTable),同步类容器的同步功能都是由JDK的Collections.synchronized******等工厂方法去创建实现的,其底层的机制都是使用synchronized关键字对每个公有的方法进行同步,或者使用Object mutex对象锁机制使每次只能有一个线程访问容器。 同步类容器都是线程安全的,并非绝对,在某些复合操作场...

2019-06-19 09:24:04 135

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除