文章目录

  • volatile
    • 内存可见性
    • 原子性与 CAS
      • CAS
        • 具体操作
  • 同步容器
    • ConcurrentHashMap
    • ConcurrentLevel
      • Segment
  • CopyOnWriteArrayList
  • CountDownLatch
    • 使用
  • 创建线程
    • Callable
  • Lock 锁
  • 虚假|等待唤醒
  • 线程通信
    • Condition
  • Thread交替执行
  • 读写锁
    • 使用
  • 线程八锁
    • 关键
  • 线程池
    • 体系
    • 工具类
    • 线程调度
  • ForkJoinPool
    • 使用

volatile

关键字,用于声明变量上
没有互斥性,

内存可见性

这里简单讲解 内存可见性
一个线程修改了 volatile 修饰的变量之后,其他线程内部的副本全部失效. 都从主存中取最新值.来计算

原子性与 CAS

volatile 只保证了数据是最新的,其他线程的副本会失效.
那么 ,原子性就由 CAS来保证.
底层是由 CPU MESI来保证.

CAS

CAS,包含了三个操作数.
内存值V,预估值A,更新值B
只有当 V == A 的时候,我们才进行操作.
将内存的值 设为 B.
而当 V == B时候,不执行任何操作

具体操作

  1. 从主存中读取值V.
  2. 和 预估值A比较
    2.1 这个预估值就是我们日常代码中的比较. 如果这个是 FALSE或者TRUE的比较
  3. 如果是预期值,就将B设置到内存中

同步容器

ConcurrentHashMap

内部采用锁分段机制保证线程安全.
还有其他如: ConcurrentHashMap,ConcurrentSkipListMap
好多种

ConcurrentLevel

分段级别. 默认为 16个段. 在这个 ConcurrentHashMap 中有16个段.
每个段为 Segment

Segment

段. 组成了 ConcurrentHashMap.
每个段指向一个链表.
但是在 JDK1.8 之后, 锁分段 修改成了 CAS

CopyOnWriteArrayList

当每次写入时,在底层复制一个新的数组,之后,再次写入.
适合 读多写少的场景

CountDownLatch

闭锁
同步辅助类. 在其他线程完成前,允许一个或多个线程一直等待.
可以完成如下操作:
确保某个计算在其所需要的的资源都被初始化后才执行
确保某个服务再其所依赖的其他服务都启动之后才执行
直到某个操作所有参与者就绪在执行

使用

CountDownLatch latch = new CountDownLatch(5);
// TODO 你的代码
// 每次执行完毕,自减 1
latch.countDown();
// 在这里等待 所有线程执行完毕. 也就是 CountDownLatch -1.即可
latch.await();
// await()完毕之后,才会执行这里的代码

构造函数的参数: 含义为:
每一个线程执行的时候,就会 - 1. 直到 这个数字为0 . 所有线程运行完毕.

创建线程

Callable

有返回值,有异常抛出的线程. 配合 FutureTask 使用

class ThreadDemo implements Callable<Integer>{@Overridepublic Integer call() throws Exception{//TODO 自己的代码return 0;}
}
public class TestCallable{public static mian(String[] args){ThreadDemo th = new ThreadDemo();FutureTask<Integer> ft = new FutureTask(th);new Thread(ft).start();Integer resultData = ft.get();sout(resultData);}
}

但是 futureTask.get() 方法时阻塞的. 我们可以用来实现闭锁操作.
类似 CountDownLatch.await() 操作

Lock 锁

同步锁. 通过手动 的 lock() 上锁 和 unLock() 解锁.

private Lock lock = new ReentrantLock();
lock.lock();
lock.unLock();

虚假|等待唤醒

主要是代码不规范,逻辑错误导致
需要了解的方法
Object:
wait(): 释放锁
notify(): 随机唤醒一个线程
notifyAll(): 唤醒所有线程
Thread:
Sleep(): 在 sync 锁定的代码中使用. 不释放锁

线程通信

Condition

增强了 Object 中的方法.
Object:
wait,notify,notifyAll
Condition:
await,signal,signalAll
通过锁获取.这个锁是当前锁. 与当前锁相关联

private Lock lock = new ReentrantLock();
private Condition condition = lock.newCondition();

Thread交替执行

俩个线程交替输出 A,B
使用 Condition 进行 指定唤醒

读写锁

ReadWriteLock 在多写的场景下需要互斥.
在 多读的场景下不需要互斥

使用

在读的场景下使用读锁 ,在写的场景下使用写锁

private ReadWriteLock rwLock = new ReentrantReadWriteLock();
public void get(){try{lock.readLock().lock();}finally{lock.readLock().unlock();}
}public void set(){lock.writeLock().lock();try{}finally{lock.writeLock().unLock();}
}

线程八锁

这里的 八锁,值得是 八种情况

关键

  1. 非静态方法锁为 this: 实例对象
  2. 静态方法锁为 Class 实例
    2.1 在任意时刻只能有一个线程持有锁

线程池

体系

  1. ThreadPoolExecutor: 线程池实现类
  2. ScheduleExecutorService: 负责线程调
    2.1 ScheduledThreadPoolThreadExecutor: 实现了线程池和调度接口
    extends ThreadPoolExecutor implements ScheduleExecutorService

工具类

Executors:newFixedThreadPool: 固定大小线程池newCachedThreadPool: 缓存线程池,线程数量大小不固定newSingleThreadExecutor: 单例线程池
ScheduledService:newSchduledThreadPool: 固定大小线程池. 延时或定时执行线程任务

一共四种线程池

线程调度


ScheduledExecutorService pool = Executors.newScheduledThreadPool(5);
pool.schedule(callable,3,TimeUnit.SECONDS);

ForkJoinPool

分支合并框架
将一个大任务拆分若干个小任务.在执行完毕之后将结果汇总.
而且还会从别的线程的任务队列偷取任务执行.

使用

public class TestForkJoin{public static main(String[] args){}ForkJoinPool fk = new ForkJoinPool();ForkJoinTask<Long> task = new ForkJoinTaskSumCaleculate(0L,100000000L);Long sum = fk.invoke(task);System.out.println(sum);}
}
// RecursiveTask 有返回值
// RecursiveAction 无返回值
class ForkJoinSumCalaulate extends RecursiveTask<Long>{private long start;private long end;// 拆分到什么地步就不进行拆分了. 临界值private static final long THURSHOLD = 10000L;// 以递归的方式执行这段代码@Ovrridepublic Long compute(){long length = end - start;if(length  <= THURSHOLD){return sum = 0L;for(long i = start; i <= end; i++){sum +=1;}}else{long middle = (start + end) / 2;ForkJoinSumCalaulate left = new ForkJoinSumCalaulate (start,middle );// 拆分,同时压入线程队列left.fork();ForkJoinSumCalaulate right= new ForkJoinSumCalaulate (middle + 1,end);return left.join() + right.join();}}
}

xxx牌JUC学习加油奥利给001初始篇章相关推荐

  1. 安卓笔记-加油-奥利给!

    1.安卓中的单位 px: 手机屏幕的最小显示单位,与设备的显示屏有关 dp: 它是与设备无关的显示单位,与屏幕尺寸有关 sp: 它是专门设置字体的大小,在系统设置中可以调整字体大小. 2.视图的宽高 ...

  2. 一个技术预案,让老板当场喊出了“奥利给”

    我还是那个前浪,很多朋友说看了我的故事后觉得有点励志,在大家都处于"中年危机"."大龄程序员找不到出路"等各种焦虑的时候,我的故事像一碗鸡汤(这个说法莫名感觉很 ...

  3. android 奥利奥功能,一加5/5T吃上Android 8.0奥利奥 这些新功能特性你不可不知

    原标题:一加5/5T吃上Android 8.0奥利奥 这些新功能特性你不可不知 一加手机在Android版本更新方面在国产手机中是最积极的一家,每次有新Android版本发布,一加H2OS往往能够让& ...

  4. 最新android版本奥利奥,最新Android 8.1即将来临,你想吃奥利奥了吗?

    原标题:最新Android 8.1即将来临,你想吃奥利奥了吗? 作为全世界使用最为广泛的手机系统--安卓系统.每次的更新自然会成为人们的焦点.那这一次的更新又将为众多安卓用户来带怎样的体验呢? 近日, ...

  5. 跟风“涨价”,品牌老化,为何“0糖”的奥利奥不被消费者买账?

    健康饮食风潮下,无糖的奥利奥也依旧是负担. 涨价大潮下,饼干巨头也坐不住了.去年,食品大亨亿滋宣布将对旗下奥利奥饼干等产品涨价7%,意图将成本负担转嫁给消费者.半年时间已过,涨价的奥利奥销量怎样了?健 ...

  6. 奥利给!搞定JVM就靠它了!不看感觉错过一个亿!吐血整理两个月,原创!全网第一份超详细JVM知识点导图!!!

    一.本人原创整理,基于尚硅谷教学视频以及深入理解Java虚拟机 导图地址请查看评论 二.导图总体如下,每一章节,每一个细节点,都有超级详细的记录.以及一些图示,代码等. 1.总体概图,已经有6.8k浏 ...

  7. 学习信奥要不要先学python

    学习信奥不必先学python,最好还是不要学python,由python转C++,如果学了一年左右的,浪费了很多的时间不说,转换起来不管老师还是学生都比较费劲儿,python还没有学明白,就又学C++ ...

  8. 朝着先能干活的方向努力。。。奥利给!!!06

    上篇文章了解了什么是中间件.了解了消息中间件,本来应该从开源的mq开始学习,但是时间紧凑,直接从公司的mq开搞! 中间件mq 公司提供了mq服务.因此mq服务不用我们下载软件手动安装了.我们直接使用m ...

  9. 奥利奥0糖系列全网首发;雀巢芭绮率先入驻哈尔滨;疫情后红参需求大幅上升...

    雀巢.每日优鲜.奥利奥.韩国人参公社.美国流行威士忌酩帝诗等企业最新动态. 新店开业 雀巢旗下巧克力品牌芭绮正式进入中国 雀巢宣布在哈尔滨中央大街开设意式甜品店,为广大消费者提供意大利国宝级巧克力品牌 ...

最新文章

  1. CBC2020 第五届中国计算机学会生物信息学会议(The Fifth CCF Bioinformatics Conference,简称CBC 2020) 2020年10月16日-10月18日在哈尔滨
  2. 怎么理解java面向对象_Java 面向对象理解?
  3. ip协议分析实验报告_入门工业通讯之EtherNet/IP协议分析
  4. Spring 依赖注入(二、注入参数)
  5. 汤家凤高等数学基础手写笔记-极限与连续
  6. 12个python超强学习网站!加python书籍推荐!( 入门python自学推荐!建议收藏!)
  7. redis java客户端配置,Java的Redis客户端选择-jedis与Lettuce
  8. mysql fabric安装使用测试
  9. Xamarin.Forms 5.0 来了
  10. 本地缓存防止缓存击穿_防止缓存爆炸的快速提示
  11. C++工作笔记-对结构体中位域的补坑说明
  12. Mysql导入导出时遇到的问题
  13. strictmode
  14. 程序员!你还能年轻几岁?
  15. 【工具使用】SecureCRT的下载、安装图文详细过程介绍
  16. FreeSwitch双轨录音
  17. PTA 数据结构与算法 7-46 新浪微博热门话题
  18. Vue实现图片滑动验证
  19. 文化IP能量有多大,舞台就有多大
  20. 64位计算机最大寻址,为什么说32位操作系统的寻址空间是4G

热门文章

  1. 山东理工大学ACM平台题答案 2561 九九乘法表
  2. Python添加pywin32
  3. 网络拓扑距离的高效KNN查询(结项报告)
  4. DDOS与DDOS追踪的介绍
  5. 360极速浏览器极速模式通过hosts文件切换兼容模式bat脚本
  6. Mac系统配置vue环境出现的权限问题解决方法
  7. 改进duilib的richedit控件的部分功能
  8. 运行 RoCEv2 的网络注意事项
  9. eNSP基础实验日记一
  10. RevitAPI之标高和轴网(Level/Grid)