• 【Java 核心】多线程笔记


     CH1.简介

    非阻塞I/O

    阻塞I/O

    实现方式

    多路I/O,异步I/O

    单线程、多线程、

    实例

    poll, epoll

    数十万个线程的MPTL

    要求:安全性与活跃性

    CH2. 线程安全性

    状态:Shared, Mutable

    instric lock

    monitor lock

    synchronized (this) {...}

    互斥体

    POSIX pthread

    缓存机制

    Example: 大整数因数分解

    共享变量注意同步,

    非共享变量可以不用,以达到并发性能和简单性的平衡,同时能够完美地实现安全性

    CH3. 可见性

    不可见性/重排序

     (未显式同步造成的)

    E.g.private static 共享变量的更改不可见

    最低安全性

    最低安全性->至少不是随机值

    除了long和double;long和double需要用volatile声明以防止读32位

    发布publish与逸出escape

    发布是类的内容跟一起被使用,但是已经调用者无法直接访问private对象;

    而逸出是错误地暴露了内部对象

    线程封闭机制

    ThreadLocal;

    栈封闭;

    (只用于不会改变共享数据的操作吧?)

    Immutable Object

    一定是线程安全的

    final是说指代(reference)不可变,但是内容可以变

    instrict lock

    private final AtomicLong count = new AtomicLong(0);

    CH4.对象的组合

    主题

    原理

    实现

    java中包装的并发容器

    Collections

    包装ArrayList和HashMap,使得线程安全

    封闭

    final+对象封闭+GuardedBy实现线程安全

    内置锁/监视器模式

    一种编码规范(一直使用同一个锁)

    委托模式

    让ConcurrentMap等原有容器代替实现线程安全性

    如果有变量间的约束关系->不能仅依靠委托->

    不可变(不可外部修改)+线程不安全=>线程安全

    可变+暴露+线程安全=>线程安全

    synchronized的失效

    大的锁只针对函数,而list内部的锁不受约束

    >> public void synchronized putIfAbsent() {list…}不能保证threadsafe

    >> 

    synchronized (list) {}

    可以用来threadsafe

    CH5.基础构建模块

    Vector容器的特殊操作的内部同步、线程安全;

    Vector外部调用的不可靠但是可以抛出异常;

    迭代器

    忽视toString字符串的隐式迭代器造成的线程安全问题

    并发容器

    CocurrentLinkedQueue

    BlockingQueue

    ConcurrentSkipListMap<-SortedMap

    ConcurrentSkipListSet<-SortedSet

    synchronizedMap<-TreeMap

    CopyOnWriteArrayList<-ArrayList

    BlockingQueue 生产消费者模式

    E.g. 桌面搜索工具

    文件建立索引

    结构:完成两个任务类+写一个含阻塞队列的函数

    阻塞型代码的中断

    表明线程被停止,需要上层代码(调用者)知道

    工具类1

    确保其他所有服务都启动才释放的锁:

    闭锁CountDownLatch, FutureTask

    Future用来返回值

    >>FutureTask future = …{public void call()};

    Thread(future);

    future.get();

    E.g.粒子运动模拟计算系统

    工具类2

    信号量Semaphore(2值信号量为mutex)。初始值为资源数量。

    工具类3 Barrier:类似闭锁,但是等待线程到达而不是事件

    E.g.生命游戏的并行算法;

    缓存

    HashMap和同步机制

     

    协程

    执行有点像多线程,但协程的特点在于是一个线程执行,那和多线程比,协程有何优势?

    最大的优势就是协程极高的执行效率。因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。

    第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。

    因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。

    挂起:suspend

    通知:notify

    阻塞:block

    唤醒: wake

    参考书籍:

    《Java 并发编程实战》

  • 相关阅读:
    (三)java程序的编译和执行
    (二)java环境搭建
    (一)java概述
    (一)mvc与mvvm设计模式
    小程序 开发之向左滑动实现删除功能
    小程序开发之三级联动
    (效果五)js获取客户端ip地址及浏览器信息
    (六)js常见四大排序
    小程序开发之组件的使用
    Nodejs实现爬虫抓取数据
  • 原文地址:https://www.cnblogs.com/wangzming/p/8421205.html
Copyright © 2020-2023  润新知