多线程学习
文章平均质量分 53
kkkddde
祝你快乐
展开
-
java--volatile关键字
为什么引入缓存程序在执行时是通过CPU指令来执行的,当数据读取和写入时,涉及到访问主存即物理内存,但由于CPU执行速度很快,而从内存中读取数据和写入数据速度很慢,为了解决这种速度上的差异,提高指令运行速度,就引入了缓存。缓存一致性缓存不一致问题初始时,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,进行加1操作之后,i的值为1,然后线程2把i的值写入内存。 最终结果i的值是1,而不是2缓存一致原创 2021-07-15 19:01:33 · 81 阅读 · 0 评论 -
基于lock实现生产者消费者模型
实现需求:面包店:10个消费者,不停的消费,每个每次消费1个5个生产者,不停的生产,每个每次生产3个库存上限100import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 面包店: * 10个消费者,不停的消费,每个每次消费1个 * 5个生产者,不停的生产,每个每次生产原创 2021-06-08 23:28:07 · 369 阅读 · 0 评论 -
线程同步和互斥
线程同步和线程互斥线程互斥:指在某一时刻只允许一个线程运行代码块,具有排他性和唯一性。对于线程A和线程B来讲,在同一时刻,只允许一个线程对临界资源进行操作,即当A进入临界区对资源操作时,B就必须等待;当A执行完,退出临界区后,B才能对临界资源进行操作。线程同步:指的是在互斥的基础上,实现进程之间的有序访问。假设现有线程A和线程B,线程A需要往缓冲区写数据,线程B需要从缓冲区读数据,但他们之间存在一种制约关系,即当线程A写的时候,B不能来拿数据;B在拿数据的时候A不能往缓冲区写,也就是说,只有当A写完数原创 2021-06-06 21:36:01 · 310 阅读 · 0 评论 -
CAS基本认识
CAS(Compare and swap)乐观锁和悲观锁乐观锁和悲观锁只是两种设计思想,和语言无关,并不是java独有的东西。乐观锁:同一个时间点,经常只有一个线程来操作共享变量。(总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。)悲观锁:同一个时间点,经常有多个线程在操作共享变量。(总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想原创 2021-06-06 21:27:27 · 221 阅读 · 1 评论 -
进程和线程的区别
进程和线程的区别根本区别:进程是操作系统资源分配的最小单位,而线程是处理任务调度和执 行的最小单位。 一个进程可以含有多个线程。资源开销:每个进程都有单独的代码和数据空间,进程之间的切换会有较大的 开销;线程可以看做是轻量级的进程,同一类线程共享代码和数据空间,每个 线程有自己独立的运行栈和程序计数器,线程之间的切换开销比较小。内存分配:同一个进程中的所有线程共享本进程的地址空间和资源,而进程之 间的地址空间和资源都是相互独立的。影响关系:一个进程崩溃后,在保护模式下不会对其他进程产生影响;而一个原创 2021-06-06 21:20:56 · 331 阅读 · 1 评论 -
jvm对synchronized的优化
jvm对synchronized的优化基于对象头的锁状态来实现,从低到高(锁只能升级,不能降级)(1)无锁(2)偏向锁:同一个对象多次加锁(重入)(3)轻量级锁(自旋锁):基于CAS实现,同一个时间点,经常只有一个线程竞争(4)重量级锁:基于系统mutex锁,同一个时间点,经常有多个线程竞争特点:mutex是系统级别加锁,线程会由用户态切换到内核态,切换成本比较高(成本高的解释:一个线程总是竞争失败,就会不停的在用户态和内核态切换,比较耗费资源,进一步,如果有很多竞争失败的线程,性能就会有很大原创 2021-06-06 20:45:43 · 237 阅读 · 1 评论