![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
书 高并发
文章平均质量分 51
金箍一梦何来愁
远方的姑娘再见
展开
-
偏向锁、轻量级锁和重量级锁
为什么会有偏向锁、轻量级锁和重量级锁?并发锁总共有4种状态:无锁状态、偏向锁状态、轻量级锁状态和重量级锁状态,每种状态在并发竞争情况下需要消耗的资源由低到高,性能由高到低。重量级锁需要通过操作系统在用户态与核心态之间切换,就像它的名字是一个重量级操作,这也是synchronized效率不高的原因,JDK1.6对synchronized进行了优化,引入了偏向锁与轻量级锁,提高了性能降低了资源消耗。什么是偏向锁?通过对大量数据的分析可以发现,大多数情况下锁竞争是不会发生的,往往是一个线程多次获得同一转载 2021-05-26 09:52:18 · 1363 阅读 · 0 评论 -
rabbitMQ面试之 高可用的消息的设置
传统的套路是:保存业务数据 ---- 发送生产消息---监听写回执的状态, 但是问题来了在搞可用的情况下两次亵裤等于自杀所以才有了今天的消息的设置最最核心的理念就是将第二次的写库,采用回到微服务来延迟处理,也就是使用异步,使用时间来换空间的方式来实现...原创 2020-06-07 15:44:22 · 158 阅读 · 0 评论 -
wait(1000) vs sleep(1000) 线程面试题
Thread.Sleep(1000) 意思是在未来的1000毫秒内本线程不参与CPU竞争,1000毫秒过去之后,这时候也许另外一个线程正在使用CPU,那么这时候操作系统是不会重新分配CPU的,直到那个线程挂起或结束,即使这个时候恰巧轮到操作系统进行CPU 分配,那么当前线程也不一定就是总优先级最高的那个,CPU还是可能被其他线程抢占去。另外值得一提的是Thread.Sleep(0)的作用,就是触发操作系统立刻重新进行一次CPU竞争,竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控原创 2020-05-19 14:28:10 · 750 阅读 · 0 评论 -
Executors.newFixedThreadPool 实验结果
、Executors在于java.util.comcurrent.包下,Executors.newFixedThreadPool(n)创建容器大小为n的线程池,表示正在执行中的线程只有n个,实践代码如下:public class TestExecute { public static void main(String[] args) { Executor exe...原创 2020-04-29 16:20:08 · 454 阅读 · 0 评论 -
concurrent包简介 ReadWriteLock 类
写锁是排他的,上了写锁,其他线程既不能上读锁,也不能上写锁;同样,需要上写锁的前提是既没有读锁,也没有写锁; 两个写锁不能同时获得无需说明,下面一段程序说明下上了读锁以后,其他线程需要上写锁也无法获得...原创 2018-08-05 16:57:51 · 218 阅读 · 2 评论 -
concurrent包简介 Condition 类
Condition的基本使用如下: * Condition是个接口,基本的方法就是await()和signal()方法; * Condition依赖于Lock接口,生成一个Condition的基本代码是lock.newCondition() * 调用Condition的await()和signal()方法,都必须在lock保护之内,就是说必须在lock.lock()和lock.unlo...原创 2018-08-05 23:15:01 · 265 阅读 · 0 评论 -
并发编程三特性-可见性技术保障
场景说明:存在两个线程A、线程B和一个共享变量stop。 如果stop变量的值是false,则线程A会一直运行。如果stop变量的值是true,则线程A会停止运行。 线程B能够将共享变量stop的值修改为ture。定义普通的共享变量://普通情况下,多线程不能保证可见性 private static boolean stop;下面的代码展示了在多线程环境中,对共享变量的共享:...原创 2018-08-01 22:49:59 · 217 阅读 · 0 评论 -
并发编程三特性-原子性技术保障
原子性定义原子性:一个或多个操作,要么全部执行且在执行过程中不被任何因素打断,要么全部不执行。1.2.Java自带的原子性在Java中,对基本数据类型的变量的读取和赋值操作是原子性操作。正确理解Java自带的原子性。下面的变量a、b都是基本数据类型的变量。a = true;//1 a = 5;//2 a = b;//3 a = b + 2;//4 a ++;//...原创 2018-08-01 23:35:28 · 190 阅读 · 0 评论 -
并发编程三特性-有序性性技术保障
3.1.有序性定义有序性:即程序执行的顺序按照代码的先后顺序执行。有前面的文章可知,JVM存在指令重排,所以存在有序性问题。在Java中,由于happens-before原则,单线程内的代码是有序的,可以看做是串行(as-if-serial)执行的。但是在多线程环境下,多个线程的代码是交替的串行执行的,这就产生了有序性问题。3.2.Java自带的有序性在前面的文章可知,Java...原创 2018-08-01 23:50:19 · 317 阅读 · 0 评论 -
concurrent包简介 ReentrantLock 类
简单的说你可以new一个ReentrantLock, 然后通过lock.lock和lock.unlock来获取锁和释放锁;注意必须将unlock放在finally块里面, reentrantlock的好处 1. 是更好的性能, 2. 提供同一个lock对象上不同condition的信号通知 3. 还提供lockInterruptibly这样支持响应中断的加锁过程,意思是说你试图去加...原创 2018-08-05 15:27:55 · 476 阅读 · 0 评论 -
wait sleep 深入分析
一.概念、原理、区别 Java中的多线程是一种抢占式的机制而不是分时机制。线程主要有以下几种状态:可运行,运行,阻塞,死亡。抢占式机制指的是有多个线程处于可运行状态,但是只有一个线程在运行。 当有多个线程访问共享数据的时候,就需要对线程进行同步。线程中的几个主要方法的比较: Thread类的方法:sleep(),yield()等 Object...原创 2018-07-31 23:59:21 · 146 阅读 · 0 评论 -
concurrent包简介 Atomic类
简单的说,这些类都是线程安全的,支持无阻塞无锁定的 Java代码 set() get() getAndSet() getAndIncrement() getAndDecrement() getAndAdd() 等操作 下面是一个测试代码 可以看到,10个线程,每个线程运行了10,000次,理论上应该有100,000次增加,使用了普通...原创 2018-08-05 14:58:24 · 346 阅读 · 0 评论 -
并发编程 volatile单例延迟加载
https://github.com/yzmaodeng/java-keypointknowledge.git @概念一: 有序性 编译器为了优化程序性能而采取的对指令进行重新排序执行的一种方式。指令重排虽然代码没有按照顺序执行,但是通过一定的机制来确保不影响运行的最终的结果。一次单线程运行不会有太大的影响,但多线程的编程就不可忽视了。 @问题的抛出:那么我们就看...原创 2018-05-26 17:25:04 · 426 阅读 · 0 评论 -
并发编程 分布式锁的三中实现方式
分布式锁需要解决的问题:1、单点问题2、不可重入问题3、死锁问题4、阻塞锁5、互斥性1、基于数据库 创建一张数据库表 锁表 使用insert语句来锁住某个方法, 保存锁信息来加锁 使用for update 来实现分布式锁2、基于redis来实现分布式锁 redis中set方法可以支持分布式锁 可以设置过期时间 可以设置请求的id信息re...原创 2018-08-04 13:25:15 · 567 阅读 · 0 评论 -
秒杀项目中 redise的消息队列的作用
Redis分布式锁解决抢购问题 redis java Charlie 2017年09月30日发布 1.4k 次浏览 废话不多说,首先分享一个业务场景-抢购。一个典型的高并发问题,所需的最关键字段就是库存,在高并发的情况下每次都去数据库查询显然是不合适的,因此把库存信息存入Redis中,利用redis的锁机制来控制并发访问,是一个不错的解决方案。首先是一段业务代码:@Transacti...转载 2018-08-04 13:32:00 · 1058 阅读 · 0 评论 -
并发编程的原子性一致性有序性的实例
public class MyClass { private static volatile int count = 0; private static AtomicInteger atomicCount = new AtomicInteger(0); private static int synchronizedCount = 0; public st...原创 2018-08-04 17:48:04 · 619 阅读 · 0 评论 -
并发编程 不能保证原子性实例
public class UnsafeConuntingFactorizer implements Servlet{ private long count = 0; private long getCount(){ return count; } public void service(ServletRequest req, ServletR...原创 2018-08-04 18:23:58 · 170 阅读 · 0 评论 -
jvm 原子性操作
以上的8个操作和CAS 这九个是JVM的原子性的操作cas:https://blog.csdn.net/mmoren/article/details/79185862原创 2018-08-04 18:57:13 · 881 阅读 · 0 评论 -
concurrent包简介 CountDownLatch线程计数器
concurrent包是jdk1.5引入的重要的包,主要代码由大牛Doug Lea完成,其实是在jdk1.4时代,由于java语言内置对多线程编程的支持比较基础和有限,所以他写了这个,因为实在太过于优秀,所以被加入到jdk之中; 通常所说的concurrent包基本有3个package组成 java.util.concurrent:提供大部分关于并发的接口和类,如BlockingQueue...原创 2018-08-05 14:35:36 · 197 阅读 · 0 评论 -
并发编程 线程的模型
原创 2018-08-03 17:25:47 · 132 阅读 · 0 评论