多线程
多线程相关
触初
这个作者很懒,什么都没留下…
展开
-
多线程面试
线程间通信 一个JVM中的话,可以使用类属性,全局变量,对象等,主要就是依赖于JVM中的共享资源;除此之外,也可以采用写文件、Redis、MySQL等,在不同的应用中的话也可以通http等网络请求也可以。当然这其中也存在着线程安全的问题,可以使用加锁或volatile+CAS,或者分布式锁等来进行处理。 虚假唤醒 也就是生产消费模型里面,为什么使用的while去判断,而不是if;因为使用if的话,在线程阻塞,释放锁后,当再次被唤醒时,则不会再去判断是否满足运行条件,导致意想不到的情况发生;而使用while,原创 2021-07-26 01:19:04 · 134 阅读 · 0 评论 -
Java集合容器
物理上只有两种,连续存储型的:数组;和跳转型的:链表。 Vector、HashTable每个方法都加的synchronized锁 SynchronizedHashMap是在方法中加的synchronized同步块 ConcurrentHashMap用的CAS 三者的性能差异不是绝对的,需要根据具体的业务场景进行测试 CopyOnWriteList适用于读操作特别多,写操作少的情况 Queue -> List(两者的区别) Queue提供了对线程友好的API offer peek poll Block原创 2021-07-14 00:44:12 · 130 阅读 · 0 评论 -
ReentrantLock
Lock lock = new ReentrantLock();(创建锁对象) lock.lock();(上锁) lock.unlock();(必须要手动释放锁,(在finally中释放)) lock.trylock(); lock.lockinterupptibly(); Condition producer = lock.newCondition();(创建同步队列) Condition consumer = lock.newCondition(); producer.await();(等待) cons原创 2021-07-14 00:42:15 · 136 阅读 · 0 评论 -
CAS杂项
(无锁优化、自旋、乐观锁) Compare And Set cas(V,E,New) if V==E V=New otherwise try again or fail CPU原语支持(原子性) ABA问题 业务不需要处理的,就不用处理;需要处理的,就增加version VarHandle(JDK9) (1, 普通属性也可以进行原子操作,2,比反射快,直接操作二进制码) ThreadLocal set Thread.currentThrea.map(threadLocal, object) (设置到了当前线原创 2021-07-14 00:40:41 · 139 阅读 · 0 评论 -
多线程与高并发(全)
本文转自我狗哥——Zs夏至 的博客 https://www.cnblogs.com/Zs-book1/p/13926198.html 多线程与高并发(全) 多线程与高并发 目录 多线程与高并发 一、了解多线程 什么是进程? 什么是线程? 并发与并行的区别 临界区 学习线程必须知道的概念: 二、 线程的使用 三种方式的区别 线程的方法 线程的状态 三、Synchronized JMM模型 volatile synchronized synchronized的使用 synchroni转载 2021-07-11 18:07:57 · 371 阅读 · 0 评论 -
Java多线程随笔
CPU性能压榨 程序:XX.exe 进程:操作系统对程序分配资源的基本单位 (一个进程中可以包含多个线程) 线程:调度执行的基本单位(多个线程共享进程的资源) 线程切换:会消耗资源(线程上下文切换) CPU密集型:计算 IO密集型:等待输入、输出,拷贝 单核CPU也可以设定多线程(在线程等待期间,可以执行其他线程) 工作线程并不是越大越好,根据CPU核数和压测,以及预留 N线程数=N物理核数U期望利用率(1+W等待时间/C计算时间) 接口比类更灵活 线程6种状态: 如何让优雅的停止一个线程?为什么不建议用s原创 2021-05-23 23:36:59 · 164 阅读 · 0 评论 -
Java几种线程池
ThreadPoolExecutor (线程池的实现类) **core没满,先添加core(核心线程) 否则,queue没满,扔到queue(任务队列中) 否则,noncore没满,创建noncore(非核心线程) 否则,拒绝策略 concurrent(并发是指任务提交) parallel(并行是指任务执行,并行是并发的子集) submit方法(带返回值) execute方法(无返回值)** Executors.newSingleThreadExecutor(); (一个线程的线程池,相比较于Threa原创 2021-05-22 02:57:01 · 163 阅读 · 1 评论 -
Java中synchronized和ReentrantLock之外的锁
CountDownLatch(门栓) zookeeper连接时经常用 countDownLatch.countDown()参数递减 countDownLatch.await()参数为0时,放行 CyclicBarrier(栅栏) cyclicBarrier.await 人齐就发车、多个线程协同执行,等所有的线程都拿到返回结果,再执行下一步 Phaser(好多排小栅栏,可以进行过滤) phaser.arriveAndAwaitAdvance()(去栅栏处等,线程齐后,进行下一步) phaser.arriveA原创 2021-05-14 20:04:48 · 233 阅读 · 1 评论 -
Java中synchronized的作用
synchronized既保证了原子性,又保证了可见性 synchronized(Object)时,最好将Object对象定义为final类型,不要用String,Integer,Long等基础类型(常量池) object.wait()(当前线程等待,释放锁) object.notify()(随机唤醒等待线程中一个,获得锁后才可以继续执行,当前线程不会释放锁) object.notifyAll()(唤醒所有等待线程,谁获得锁后谁可以继续执行,当前线程不会释放锁) 是可重入锁,(在一个同步方法中,调用另一个同原创 2021-05-13 00:49:58 · 458 阅读 · 0 评论 -
Java中volatile的作用
保证线程可见性(MESI,PU的缓存一致性协议) 禁止指令重排序(读、写屏障) (常用在单例模式的双重检测写法)原创 2021-05-07 21:45:39 · 181 阅读 · 0 评论 -
Java线程SleepYieldJoin
对线程执行的基本操作 代码结构 源码 package com.myspringboot.juc.c01thread; public class SleepYieldJoinTest { public static void main(String[] args) { testSleep(); // testYield(); // testJoin(); } // 当前睡眠指定时间 private static void原创 2021-04-30 02:13:32 · 148 阅读 · 0 评论 -
Java创建线程的几种方式
创建线程的几种方式 代码结构 源码 package com.myspringboot.juc.c01thread; import java.util.concurrent.Callable; import java.util.concurrent.Executors; public class CreateThread { public static void main(String[] args) { // 集成Thread类 new MyThread().s原创 2021-04-26 01:33:38 · 187 阅读 · 0 评论