Skip to content

FunCheney/java-notes

Repository files navigation

concurrency

🔎 1. 概要

🔑 并发是什么

  并发是指在某个时间段内,多任务交替处理的能力。

🔑 多线程能干什么

  • 1.提高资源的利用、提高任务的平均执行速度
  • 2.公平(对cpu的占用)
  • 3.方便(某些应用场景下,不同的线程执行不同的任务,并进行必要的协调,要比写一个程序执行所有的任务更合理)

🔑 为什么要学习并发与多线程

  • 1.硬件技术的发展,高并发是未来的趋势,要不要了解一下?
  • 2.Java语言天生支持多线程,要不要了解一下?
  • 3.Java程序员进阶必备,要不要了解一下?

⁉️ 2. 多线程带来的优点与风险

⭕ 2.1 优点

  • 1.使用多处理器

  • 2.模型简化

  • 3.对异步事件的简单处理

  • 4.用户界面的更佳响应

❌ 2.2 风险

  • 1.线程安全

  • 2.活跃性问题

    1. 死锁

    2. 饥饿

      a. 高优先级吞噬低优先级的CPU时间片

      b. 线程被永久堵塞在一个等待进入同步块的状态

      c. 等待的线程永远不被唤醒

    3. 活锁

  • 3.性能问题

💻 3. 如何学习

image

👓 4. 抽象的概念

📑 计算机内存模型

  • 1.缓存一致性问题
  • 2.乱序执行优化与问题

🔗 计算机内存模型

📑 顺序一致性

📑 Java内存模型

  • 1.设计的初衷
  • 2.解决的问题

🔗 Java内存模型

⚔️ 5. Java并发机制的底层实现

📓 volatile

📓 synchronized

📓 原子操作即实现原理

👓 6. Java并发编程的基础

  • 1.进程、线程

    进程:进程是操作系统结构的基础,是一次程序的执行;是一个程序机器数据在处理机上顺序执行时发生的活动;是程序在一个数据集合上 所运行的过程,它是系统进行资源分配和调度的独立单位。

    线程:线程是CPU调度和分派的基本单位,为了更充分地利用cpu资源,一般都会是用多线程进行处理。

    线程拥有自己的操作栈、程序技术器、局部变量表等资源,它与同一进程内的其他线程共享该进程的资源。

👀 7. 线程安全

📝 何为线程安全

📝 Java中操作共享数据安全程度

  • 1.不可变

  • 2.绝对线程安全

  • 3.相对线程安全

  • 4.线程兼容

  • 5.线程对立

📝 如何保证线程安全

  • 1.互斥同步

  互斥同步是常见的一种并发正确的手段。同步是指在多个线程并发访问共享数据时,保证共享数据 在同一时刻只被一个线程使用。

  互斥是实现同步的一种手段,临界区、互斥量和信号量都是主要的互斥实现方式。

  1). synchronize 是实现互斥的主要手段。

  2). ReentrantLocak 实现同步。

  • 2.非阻塞同步

  基于冲突检测的乐观并发策略。就是先进行操作,如果没有其他线程争用共享数据,那操作就成功了;如果有共享数据的争用,产生了冲突,在采取其他的补偿措施(最常见的补偿措施就是不断重试,知道成功为止),这种乐观的并发策略的许多实现都不需要把线程挂起,因此这种操作称为非阻塞同步(Non-Blocking Synchronization).

  1). CAS

  • 3.无同步方案

  1).在不涉及到操作共享数据的情况下,这样的代码就是线程安全的。不需要在通过同步措施来保证正确性。

  2).使用线程局部变量ThreadLocal

✏️ 8. 可见性、有序性、原子性

📝 原子性

📝 可见性

📝 有序性

📓 9.多线程的一些知识总结

📖 final

📖 单例模式与多线程

🔒 10.锁

  在JUC包中Lock是顶层接口。

  并发编程中锁的分类总结

内部锁

  利用synchronized实现。使用synchronized关键字将会隐式的获取锁,但是它将锁的获取与释放固化了,也就是先获取的再释放。 这种方式虽然简化了同步管理,但是可扩展性相较于显示的获取锁变差了。

显示锁

  利用volatile实现。定义了一个volatile int state变量作为共享资源。如果线程获取资源失败,则进入同步FIFO队列中等待。 如果获取成功,就执行临界区域代码。执行完释放资源时,会通知同步队列中的等待线程来获取资源后出队并执行。

🛠️ 11.J.U.C

J.U.C 中相关类

image

locks包下面

  • AQS

    1.初识AQS

    2.AQS

     1. ReentrantReadWriteLock的源码学习之实现

     2. ReentrantReadWriteLock的源码学习之同步容器的实现

  • LockSupport
  • Condition

     1. Condition使用示例

     2. Condition实现原理及源码分析

Java并发容器和框架

  • ConcurrentHashMap

     1. ConcurrentHashMap与红黑树

     2. ConcurrentHashMap的APi源码是实现与分析

  • ConcurrentLinkedQueue;
  • 阻塞队列

atomic包下面

  • AtomicInteger
  • AtomicIntegerFieldUpdater
  • AtomicReference

Queue相关

线程池

🔗 高并发处理思路与手段

image

缓存

缓存的作用?什么是缓存?

redis

数据库

MySql

队列

Disruptor

RPC

🐅 进击JVM

为什么学习JVM

  • 面试要问?学不学。。。
  • 生产过程中,遇到问题要分析解决。。。
  • Java进阶必备。。。

基础知识

内存结构

  Java虚拟机在执行Java程序的过程中会把它所管理的内存区域划分为若干个不同的数据区域。这些区域有各自的用途,以及创建和销毁时间,有的区域随着虚拟机进程的启动而存在,有些区域则依赖用户线程的启动和结束而建立和销毁。

image

垃圾回收机制

About

java学习笔记

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages