zoukankan      html  css  js  c++  java
  • 【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 并发编程实战》

  • 相关阅读:
    BF算法和KMP算法
    Python课程笔记 (五)
    0268. Missing Number (E)
    0009. Palindrome Number (E)
    0008. String to Integer (atoi) (M)
    0213. House Robber II (M)
    0198. House Robber (E)
    0187. Repeated DNA Sequences (M)
    0007. Reverse Integer (E)
    0006. ZigZag Conversion (M)
  • 原文地址:https://www.cnblogs.com/wangzming/p/8421205.html
Copyright © 2011-2022 走看看