高并发编程
文章平均质量分 64
欲滴007
这个作者很懒,什么都没留下…
展开
-
AQS截图
栅栏和countdownlatch区别是,栅栏可以重复利用线程,特别是不确定的线程数量原创 2020-10-15 18:19:16 · 98 阅读 · 0 评论 -
synchronized
一、synchronized1、原理:synchronize是线程互斥的,所以能保证共享数据一致性。synchronize底层是有 monitorenter 和 monitorexit 两个jvm指令;他能保证任何线程在enter之前从主内存中读取共享数据,在exit将共享数据刷新到主内存。可参考 深入synchronize原理2、如下反编译带有synchronize代码程序:3、获取 和 释放 对象关联的monitor锁机制synchronize是不可中断的只有像sleep、wai原创 2020-10-14 14:16:39 · 287 阅读 · 0 评论 -
自旋锁、乐观锁、悲观锁、重入锁、公平锁
1、乐观锁:假定没有冲突,在更新数据时比较发现不一致时,则读取新值修改后重试更新。(自旋锁就是一种乐观锁)2、悲观锁:假定会发生冲突,所有操作都加上锁,比如读数据操作。3、自旋锁:循环使用cup时间,尝试cas操作直至成功返回true,不然一直循环。(比较内存值与线程旧值是否一致,一致则更新,不然则循环)4、共享锁(多读):给资源加上读锁,其他线程也可以加读锁,可以同时读,不可以加写锁。5、独享锁(单写):给资源加上写锁,可以修改资源,其他线程不能再加锁。6、可重入锁、不可重入锁:线程获取到一把锁原创 2020-10-13 23:36:24 · 2268 阅读 · 0 评论 -
线程安全问题
一、可见性、有序性// 1、 jre/bin/server 放置hsdis动态链接库// 测试代码 将运行模式设置为-server, 变成死循环 。 没加默认就是client模式,就是正常(可见性问题)// 2、 通过设置JVM的参数,打印出jit编译的内容 (这里说的编译非class文件),通过可视化工具jitwatch进行查看// -server -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:+LogCompilatio...原创 2020-10-12 18:40:28 · 208 阅读 · 0 评论 -
线程池
一、为什么要用线程池1、频繁的创建、启动、关闭线程消耗大量的系统资源2、提高系统响应速度,当有任务到达时,通过复用已存在的线程,无需等待新线程的创建便能立即执行;3、方便线程并发数的管控。因为线程若是无限制的创建,可能会导致内存占用过多而产生OOM,并且会造成cpu过度切换(cpu切换线程是有时间成本的(需要保持当前执行线程的现场,并恢复要执行线程的现场))。4、提供更强大的功能,延时定时线程池。详情参考...原创 2020-10-11 11:11:56 · 141 阅读 · 0 评论 -
线程的基本概念
一、线程介绍早年单核cpu无法实行并行,但是可以让我们感受到并行是由于cpu的快速切换,让你感觉多任务同时执行;在如今的多核CPU时代是已经实现并行。每个线程有自己单独程序计数器(指向下一行执行的指令)、本地方法栈、虚拟机栈(局部变量表、操作数栈、动态链接、方法出口)jvm启动就会有一个main线程,其他线程默认重Thread-0开始,也会有守护线程、垃圾回收线程和RMI线程。进程:一个应...原创 2019-08-31 20:18:44 · 429 阅读 · 0 评论 -
Tread
一、构造函数这里列举最长参数的的构造,为了解析其各个参数作用/** * ThreadGroup 如果没有设置默认是创建该线程的线程的TreadGroup(一般是main) * 如果传入一个Runnable子类,就会调用其run方法。如果为null,将调用Tread自己的run(); * name 设置线程名字,可以不设置,默认从线程Thread-0开始(当然这个构造必须设置)...原创 2019-08-11 11:45:37 · 359 阅读 · 0 评论 -
死锁
一、什么情况下产生死锁官方说法:死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程持有获取开启开启持有获取一号线程A锁B锁开始二号线程B锁A锁大白话:两个以上线程在执行过程中,一号线程持有A锁,准备获取B锁执行接下来程序;然而二号线程却持...原创 2019-08-11 19:35:39 · 100 阅读 · 0 评论 -
线程异常处理与勾子程序
一、为何要捕获线程异常1、线程发生异常,由于线程中的run方法不允许抛出异常,外面不知道什么情况发生,只是输出一些堆栈信息2、为了更好的保护信息和不浪费资源public class ExitCaptor { public static void main(String[] args) { int i = 0; //勾子程序,在出现异常或者被kil时调...原创 2019-08-12 15:01:06 · 227 阅读 · 0 评论 -
读写分离锁,读写锁设计模式
对于共享数据的操作无非读和写,多线程条件下,对于共享资源是否冲突,如下图:如上可以看出对于写操作是不需要加锁的,这样可以很大提升性能;写操作都需要具有排他方式的加锁。public class ReadWriteLock { //等待读操作线程数 private int watingReades; //正在读得线程数,这里支持多线程同时读取 private int readeingReades; //等待写的线程数 private int wateingW转载 2020-09-22 13:39:06 · 538 阅读 · 0 评论