就是 从代码到成为程序的过程
所以这很明显就是我们的编译原理
和os 打交道这很明白就是 操作系统
和另一台机器打交道,那么就是计算机网络
从代码到程序
就是从 代码到字节码(javap 命令可以看到),到机器码到01
这样就串起来了
这个可以对应到硬件的内存来学习,2013年摩尔定律失效
一个是共享,----堆和方法区
其余的都是隔离的
棧
需要了解棧帧
本地方法区
程序计数器
内存模型的学习,就是我们所写的类,方法,类变量,成员变量,循环,锁等的实际的映射
以前我们学习面向对象只要到new 就ok 了,现在我们要会多种的new ,反射 ,clone 等,
这里面要学习类的加载机制
现在我们还要学习,对象这个东西,包括对象头啊,锁就在对象头里面
这里面的锁标记为,然后决定了四种锁,这个就是在1.6以后
所以有了JUC ,当然这个因果链,还是比较长的
JUC 只是 java一个并发的工具包,所以在util 里面
,这样也不用死记硬背
可见性,就是我们所说的viloatie 关键字 和sync 关键字
原子
顺序
其中顺序,有指令重排和h -B 原则
原子性指令
其实就是操作指令mutex
有两个主要的包 原子 一些原子的并发工具
一个是lock,这个就比较重要了,首先就是大名鼎鼎的AQS ,我们这些小卡拉米经常不碰,但是经常面试到的一个重点
三个重点,一个是通用的加锁和释放的方法,一个就是状态值,一个就是一个队列
这和去火车站买票一样,排队是有序快速的一个方案,当然异步预定,也是
还有线程池这个good thing
两个重要的点,一个手机节约资源,一个是统一管理
它的核心参数,主要是服务于主要的工作流程
还有一个worker
有JDK 提供的,有线程提供的,有基于时间的
三、锁场景
多线程锁是一种用于在多线程编程中保护共享资源的同步机制。以下是一些适合使用多线程锁的场景:
数据库访问:多个线程同时访问数据库可能导致数据一致性问题,使用锁可以保证数据的完整性和正确性。
文件读写:多个线程同时读写同一个文件可能会导致文件损坏或者数据丢失,使用锁可以保证文件的完整性和正确性。
共享内存:多个线程访问同一块共享内存时,使用锁可以保证每个线程都能正确读取或写入共享内存的数据。
队列操作:多个线程同时对队列进行操作可能会导致数据错乱或者数据丢失,使用锁可以保证队列的操作顺序和数据的正确性。
网络通信:多个线程同时进行网络通信时,使用锁可以保证数据传输的完整性和正确性。
需要注意的是,多线程锁并不是万能的,过多的锁使用会降低程序的性能。因此,在使用锁的时候应该注意权衡锁的粒度和性能的需求。
序号 锁名称 应用
1 乐观锁 CAS
2 悲观锁 synchronized、vector、hashtable
3 自旋锁 CAS
4 可重入锁 synchronized、Reentrantlock、Lock
5 读写锁 ReentrantReadWriteLock,CopyOnWriteArrayList、CopyOnWriteArraySet
6 公平锁 Reentrantlock(true)
7 非公平锁 synchronized、reentrantlock(false)
8 共享锁 ReentrantReadWriteLock中读锁
9 独占锁 synchronized、vector、hashtable、ReentrantReadWriteLock中写锁
10 重量级锁 synchronized
11 轻量级锁 锁优化技术
12 偏向锁 锁优化技术
13 分段锁 concurrentHashMap
14 互斥锁 synchronized
15 同步锁 synchronized
16 死锁 相互请求对方的资源
17 锁粗化 锁优化技术
18 锁消除 锁优化技术