线程
小小羊肉串。
余生没那么长,请你忠于自己,活的像自己。
展开
-
AQS
文章目录1.AQS简介2.AQS的数据结构1.AQS简介AQS全称Abstract Queued Synchronizer ,即抽象队列同步器。分步理解:抽象:抽象类,值实现一些主要逻辑,有些方法由子类实现;队列:使用先进先出(FIFO)队列存储数据;同步:实现了同步的功能。AQSD的作用:是用来构建锁和同步器的框架,使用AQS能够简单高效构造出应用广泛的构造器。比如ReentrantLock、Semaphore、ReentrantReadWriteLock、SynchronousQueue、原创 2021-02-26 00:18:51 · 179 阅读 · 0 评论 -
乐观锁和悲观锁
1.悲观锁线程每次访问能同步资源时,会给操作数据加锁,保证临界区的程序同一时间只能有一个线程执行。没获得锁线程会进入阻塞队列。等待再次获取锁。2.乐观锁又称为“无锁”。通过CAS技术保证线程执行的安全性。乐观锁适用于读多写少的场景,避免频繁加锁影响性能;悲观锁适用于写多读少的场景,避免频频繁失败和重试影响性能。3.CASCAS全称(Compare And Swap)比较并替换,是一种无锁算法。在CAS中,有3个值:V:要更新的内存地址;E: 旧值N:新值当且仅当V的值等于E时,将V的值原创 2021-02-25 23:47:31 · 342 阅读 · 0 评论 -
synchronized与锁
java多线程的锁都是基于对象的,java中的每一个对象都可以作为一个锁。类锁其实也是对象锁。1.synchronized关键字(1)synchronized在实例方法上,锁为当前实例 private synchronized void testMethod(String flag) throws InterruptedException { synchronized (lock) { for (int i = 0; i < 10; i++) {原创 2021-02-25 16:47:31 · 151 阅读 · 1 评论 -
volatile
1.基本概念内存可见性:指线程之间的可见性,当一个线程修改了共享变量时,另一个行程可以读取到修改后的值。重排序:为了优化性能,对原有的指令执行顺序重新排序,重排序可能发生在多个阶段,比如编译重排序、CPU重排序等。happens-before规则:是一个给程序员的使用规则,只要程序员遵循hanppens-before编码,JVM就能保证指令在多线程的执行顺序符合程序员的预期。2.volatile的功能保证变量的内存可见性;禁止volatile变量和普通变量重排序。2.1 volatil原创 2021-02-24 15:27:22 · 85 阅读 · 0 评论 -
JMM的happens-before规则
1.happens-beforeJMM使用happens-before概念来定制两个操作之间的顺序,这两个操作可以使同一个线程以内,也可以是不同线程之间。JMM通过happens-before关系向程序员提供跨线程的内存可见性保证。(1)如果一个操作happens-before另一个操作,那么第一个操作的结果将对第二个操作可见。(2)如果两个操作存在happens-before关系,并不意味着java平台的具体实现一定要按照happens-before指定顺序执行,如果重排序之后的执行结果,与按hap原创 2021-02-23 15:49:18 · 211 阅读 · 1 评论 -
java内存模型的基础知识
1.java运行时内存的划分栈与堆的区别:栈内存存储的是局部变量,而对内存存储的是实体;栈内存的更新速度快于堆内存,因为局部比纳凉的生命周期很短。栈内存存储的变量生命周期一旦结束就会被释放,而堆内存存储的实体被垃圾回收机制不定时回收。对每一个线程来说,栈是私有的,堆是共有的。2.堆是共享的,关于堆中内存不可见问题线程的共享变量存储在主内存中,每个线程都有一个私有的本地内存。它存储了该线程以读、写共享变量的副本。java线程之间的通信由java内存模型控制(j简称JMM)。JMM定义了线原创 2021-02-20 17:27:44 · 91 阅读 · 0 评论 -
进程与线程的基本概念
@[TOP]1.批处理操作系统将需要操作的一系列指令列成清单,交给计算机。用户将多个需要执行的程序写在磁盘上,将磁盘交由计算机逐次执行这些指令,然后将执行的结果写在另一个磁盘上。缺点:批处理操作系统的指令运行方式是串行执行的,内存中始终只有一个程序在运行,前面的程序执行完成后面的才能执行。前面的程序回应为I/O操作、网络等原因阻塞,所以效率也不高。2.进程进程是应用程序在内存中分配的空间,也就是正在运行着的程序,各个进程之间互不干扰。进程保存着程序每一个时刻运行的状态。程序:用一定的语言(ja原创 2021-02-19 11:43:54 · 211 阅读 · 1 评论 -
并发—共享变量的可见性
参考:http://www.itwanger.com/java/2019/11/09/java-bingfa-3.html同步:我们可以通过同步保证变量的原子性(一个或者多个操作要么全部执行,要在操作中不会被任何因素打断,要不全部都不执行)共享变量的可见性:多个线程访问同一个变量时,一个线程修改了变量的值,其他线程能够立即看到修改的变量的值。java内存模型:java内存模型中描述了java程序中各种变量的访问规则,以及在jvm中将变量存储到内存,从内存读取变量的细节。所有的比纳凉都是存储在主内存中原创 2021-02-10 14:08:49 · 123 阅读 · 0 评论