Java并发多线程

三种创建线程(Thread)的方式:
直接使用 Thread
Thread + Runnable
Thread + Callable + FutureTask--返回值
六种状态
start / run
sleep / yield
join / join(long n)
interrupt
setDaemon 守护线程
 Java 内存模型(Java Memory Model,JMM
原子性-可见性-有序性
Java并发机制底层实现的三个关键要素:volatile、synchronized、原子性操作
happens-before 规则--前一个操作的结果对后续操作时可见的。
对于可见性,可以使用 volatile 关键字来保证,不仅如此,volatile 还能起到禁止指令重排的作用;另外, synchronized 和 final 这俩关键字也能保证可见性。
对于原子性,我们可以使用锁 和 java.util.concurrent.atomic 包中的原子类来保证。(给萌新解释一下,java.util.concurrent,简称 J.U.C,就是一个包,也称为并发包。现在网上大部分博客都会直接说 JUC,对萌新不是很友好),我们可以看看 juc.atomic 中有哪些类:
CAS操作
锁的概念:

悲观锁和乐观锁
重量级锁和轻量级锁
自旋锁
偏向锁
重入锁和不可重入锁
公平锁和非公平锁
共享锁和排他锁
AbstractQueuedSynchronizer 类(也就是大名鼎鼎的 AQS,译为队列同步器,简称同步器)。
JUC 其实可以分为五大类:

Lock 框架(locks 包)
原子类(atomic 包)
并发集合
线程池
工具类

然后常用的工具类还是有必要学习下:

CountDownLatch
CyclicBarrier
Semaphore
Exchanger
ThreadLocal
Java运行时的数据区域--堆(对象实例)--方法区(常量-静态变量)(共有的)-
私有-虚拟机栈(栈帧)--本地方法栈(Native方法)--程序计数器(字节码指令地址)
全部评论
感谢分享,学习一下
点赞 回复 分享
发布于 2023-03-15 16:00 山东
感谢大佬分享
点赞 回复 分享
发布于 2023-03-15 15:57 四川
阻塞 阻塞调用是指调用方发出request的线程因为某种原因(如:等待系统资源)被服务方挂起, 当服务方得到response后就唤醒挂起线程,并将response返回给调用方。 非阻塞 非阻塞调用是指调用方发出request的线程在没有等到结果时不会被挂起,并且直到得到 response 后才返回。 阻塞和非阻塞最大的区别就是看调用方线程是否会被挂起。 join:当子线程调用join时,主线程会被阻塞,
点赞 回复 分享
发布于 2023-03-13 23:01 日本
主进程结束子进程不一定结束-孤儿进程--但是子进程设置为守护进程的时候-就会随着主进程结束而结束
点赞 回复 分享
发布于 2023-03-13 23:00 日本
通俗来说,当我们往一个集合 A 中添加元素的时候,并不是直接就实实在在地插入这个集合 A 中,而是先对当前的集合进行一个拷贝(Copy)得到一个新的集合 A_copy,然后再往这个 A_copy 中插入元素。当写操作执行完毕后,集合 A 就没有用了,将指向原来集合 A 的指针指向新集合A_copy COW,Copy On Write,顾名思义,写时复制。
点赞 回复 分享
发布于 2023-03-13 22:54 日本
读写锁当以写模式加锁而处于写状态时任何试图加锁的线程(不论是读或写)都阻塞,当以读状态模式加锁而处于读状态时“读”线程不阻塞,“写”线程阻塞。读模式共享,写模式互斥。 条件变量可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件的测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。 自旋锁上锁受阻时线程不阻塞而是在循环中轮询查看能否获得该锁,没有线程的切换因而没有切换开销,不过对CPU的霸占会导致CPU资源的浪费。 所以自旋锁适用于并行结构(多个处理器)或者适用于锁被持有时间短而不希望在线程切换产生开销的情况
点赞 回复 分享
发布于 2023-03-13 22:51 日本
静态同步方法(synchronized 修饰的静态方法),锁是当前类的 Class 对象。 如果线程 A 释放锁,然后线程 B 获取了这个锁,那这个过程其实就相当于线程 A 通过主内存向线程 B 发送消息。
点赞 回复 分享
发布于 2023-03-13 22:50 日本
获取公平锁需要排队,而获取非公平锁优先选择插队,如果插队失败,再采取排队的方式 除了 ReentrantLock,synchronized 也是可重入锁,可重入锁的一个优点是可一定程度避免死锁。 Java 中的 synchronized 和 ReentrantLock 就是排他锁。 ReentrantReadWriteLock(读写锁)中的读锁就是共享锁。
点赞 回复 分享
发布于 2023-03-13 22:46 日本
阻塞或者唤醒一个 Java 线程是需要操作系统切换到内核态来完成的,这 常情况下锁获取失败就应该阻塞入队,但是有时候可能刚一阻塞,别的线程就释放锁了 do-while 循环。更底层来说自旋操作就是空转 CPU,执行一些无意义的指令,目的就是不让出 CPU 等待锁的释放 不放弃处理器的执行时间 自旋锁的实现原理是 CAS” Java 中的 synchronized 有偏向锁、轻量级锁、重量级锁,分别对应了锁只被一个线程持有、不同线程交替持有锁、多线程竞争锁三种情况。
点赞 回复 分享
发布于 2023-03-13 22:41 日本
)根据多个线程竞争锁时是否需要排队,可以分为: 公平锁:需要排队 非公平锁:先尝试插队,插队失败再排队 5)根据一个线程是否能够重复获取同一把锁,可以分为: 可重入锁:能被同一个线程重复获取 不可重入锁:不能被同一个线程重复获取 6)根据锁只能被单个线程持有还是能被多个线程共同持有,可以分为: 排他锁:锁只能被单个线程持有 共享锁:锁能被多个线程共同持有
点赞 回复 分享
发布于 2023-03-13 22:37 日本
1)根据线程要不要锁住共享资源,可以分为: 悲观锁:锁住共享资源 乐观锁:不锁住共享资源 2)如果试图锁住共享资源失败,那么线程要不要阻塞?如果不想要阻塞线程,可以通过以下两种锁实现: 自旋锁 适应性自旋锁 3)以下这 4 种锁都是专门针对 synchronized 关键字的: 无锁 偏向锁 轻量级锁 重量级锁
点赞 回复 分享
发布于 2023-03-13 22:37 日本

相关推荐

点赞 评论 收藏
分享
评论
点赞
2
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务