1 并发编程三要素
Java 并发编程三要素_新猿一马的博客-CSDN博客并发编程三要素学习。https://blog.csdn.net/jack1liu/article/details/124310132
2 死锁产生和解决
死锁以及避免死锁_新猿一马的博客-CSDN博客主要记录死锁是什么,产生死锁的原因以及如何解决死锁问题。https://blog.csdn.net/jack1liu/article/details/97574883
3 创建线程的方式创建线程的四种方式_新猿一马的博客-CSDN博客_线程的创建四种创建方式及其比较。https://blog.csdn.net/jack1liu/article/details/112973372
4 线程的生命周期Java线程生命周期_新猿一马的博客-CSDN博客Java线程生命周期https://blog.csdn.net/jack1liu/article/details/124312463
5 深入理解和运用线程池深入理解和运用线程池_新猿一马的博客-CSDN博客目录一 什么是线程池二 为什么需要线程池三 创建线程池的四种方式四 execute() 方法执行过程一 什么是线程池 线程池就是线程集合的池子,是一种将任务添加到队列,然后创建线程后自动启动这些任务的流程。二 为什么需要线程池 使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能...https://blog.csdn.net/jack1liu/article/details/97046623
6 ThreadLocal 理解和源码分析ThreadLocal 理解和源码分析_新猿一马的博客-CSDN博客目录一 ThreadLocal 是什么二 ThreadLocal 实现原理三 ThreadLocal 应用场景四 参考文档一 ThreadLocal 是什么 ThreadLocal 本地线程变量,通过 set() 和 get() 方法来维护局部变量。不同线程之间局部变量彼此隔离,互不影响。二 ThreadLocal 实现原理2.1 我们可以先来看看 Th...https://blog.csdn.net/jack1liu/article/details/97614116
7 单例模式的线程安全性01-单例还是多例_新猿一马的博客-CSDN博客目录一 什么是单例模式二 使用单例模式的优点三 单例模式的实现方式3.1 懒汉式-基础版3.2懒汉式-线程安全版3.3 懒汉式-双重检查加锁版3.4 饿汉式3.5Holder模式3.6 枚举一 什么是单例模式 保证一个类仅有一个实例,并提供一个访问它的全局访问点。二 使用单例模式的优点减少了类的频繁创建,降低了系统资源开销。类...https://blog.csdn.net/jack1liu/article/details/101421259
8 synchronized 的实现原理[死磕 Java 并发] --- 深入分析synchronized的实现原理 - Java 技术驿站http://cmsblogs.com/?p=2071
9 volatile的实现原理[死磕 Java 并发] --- 深入分析volatile的实现原理 - Java 技术驿站http://cmsblogs.com/?p=2092
10 深入分析CAS[死磕 Java 并发] --- J.U.C之并发工具类:CyclicBarrier - Java 技术驿站http://cmsblogs.com/?p=2235
11 深入分析 AQS[死磕 Java 并发] --- J.U.C之AQS:AQS简介 - Java 技术驿站Java的内置锁一直都是备受争议的,在JDK1.6之前,synchronized这个重量级锁其性能一直都是较为低下,虽然在1.6后,进行大量的锁优化策略(【死磕Java并发】-https://www.cmsblogs.com/article/1391297814356692992[死磕 Java 并发] --- J.U.C之AQS:CLH同步队列 - Java 技术驿站在上篇博客【死磕Java并发】-----J.U.C之AQS:AQS简介中提到了AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。CLH同步队列是一个FIFO双向队列,https://www.cmsblogs.com/article/1391297829913366528
12 重入锁 ReentrantLock[死磕 Java 并发] --- J.U.C之重入锁:ReentrantLock - Java 技术驿站此篇博客所有源码均来自JDK1.8ReentrantLock,可重入锁,是一种递归无阻塞的同步机制。它可以等同于synchronized的使用,但是ReentrantLock提https://www.cmsblogs.com/article/1391297847235842048
13 常用的并发工具类有哪些
- CountDownLatch
[死磕 Java 并发] --- J.U.C之并发工具类:CountDownLatch - Java 技术驿站此篇博客所有源码均来自JDK1.8在上篇博客中介绍了Java四大并发工具一直的CyclicBarrier,今天要介绍的CountDownLatch与CyclicBarrier有https://www.cmsblogs.com/article/1391297877455802368
- CyclicBarrier
[死磕 Java 并发] --- J.U.C之并发工具类:CyclicBarrier - Java 技术驿站此篇博客所有源码均来自JDK1.8CyclicBarrier,一个同步辅助类,在API中是这么介绍的:它允许一组线程互相等待,直到到达某个公共屏障点(commonbarrierhttps://www.cmsblogs.com/article/1391297871143374848
- Semaphore
[死磕 Java 并发] --- J.U.C之并发工具类:Semaphore - Java 技术驿站此篇博客所有源码均来自JDK1.8信号量Semaphore是一个控制访问多个共享资源的计数器,和CountDownLatch一样,其本质上是一个“共享锁”。Semaphore,https://www.cmsblogs.com/article/1391297883185221632
- Exchanger
[死磕 Java 并发] --- J.U.C之并发工具类:Exchanger - Java 技术驿站此篇博客所有源码均来自JDK1.8前面三篇博客分别介绍了CyclicBarrier、CountDownLatch、Semaphore,现在介绍并发工具类中的最后一个Exchanhttps://www.cmsblogs.com/article/1391297888105140224
- CyclicBarrier 和 CountDownLatch 的区别
14 乐观锁和悲观锁
乐观锁与悲观锁_还能坚持的博客-CSDN博客_乐观锁和悲观锁1、悲观锁1.1 定义总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。Java中synchronized和ReentrantLock等独占锁就是悲观锁思想的实现。手动加悲观锁:读锁:LOCK tables test_db read,释放锁:https://blog.csdn.net/qq_35091353/article/details/116299465
15 深入理解 ConcurrentHashMap[死磕 Java 并发] --- J.U.C之Java并发容器:ConcurrentHashMap - Java 技术驿站此篇博客所有源码均来自JDK1.8HashMap是我们用得非常频繁的一个集合,但是由于它是非线程安全的,在多线程环境下,put操作是有可能产生死循环的,导致CPU利用率接近10https://www.cmsblogs.com/article/1391297896166592512
16 其他synchronized、volatile、CAS 比较
- synchronized 是悲观锁,属于抢占式,会引起其他线程阻塞。
- volatile 提供多线程共享变量可见性和禁止指令重排序优化。
- CAS 是基于冲突检测的乐观锁(非阻塞)
sleep 方法和 wait 方法有什么区别?
这个问题常问,sleep 方法和 wait 方法都可以用来放弃 CPU 一定的时间,不同点在于如果线程持有某个对象的监视器,sleep 方法不会放弃这个对象的监视器,wait 方法会放弃这个对象的监视器。
为什么 wait()方法和 notify()/notifyAll()方法要在同步块中被调用?
这是 JDK 强制的,wait()方法和 notify()/notifyAll()方法在调用前都必须先获得对象的锁。多线程同步有哪几种方法?
Synchronized 关键字,Lock 锁实现,分布式锁等。线程的调度策略
线程调度器选择优先级最高的线程运行,但是,如果发生以下情况,就会终止线程的运行: (1)线程体中调用了 yield 方法让出了对 cpu 的占用权利 (2)线程体中调用了 sleep 方法使线程进入睡眠状态 (3)线程由于 IO 操作受到阻塞 (4)另外一个更高优先级线程出现 (5)在支持时间片的系统中,该线程的时间片用完怎么唤醒一个阻塞的线程
如果线程是因为调用了 wait()、sleep()或者 join()方法而导致的阻塞,可以中断线程,并且通过抛出 InterruptedException 来唤醒它;如果线程遇到了 IO 阻塞,无能为力,因为 IO 是操作系统实现的,Java 代码并没有办法直接接触到操作系统。不可变对象对多线程有什么帮助
前面有提到过的一个问题,不可变对象保证了对象的内存可见性,对不可变对象的读取不需要进行 额外的同步手段,提升了代码执行效率。Java 中用到的线程调度算法是什么
抢占式。一个线程用完 CPU 之后,操作系统会根据线程优先级、线程饥饿情况等数据算出一个总的优先级并分配下一个时间片给某个线程执行。什么是线程调度器(Thread Scheduler)和时间分片(Time Slicing)?
线程调度器是一个操作系统服务,它负责为 Runnable 状态的线程分配 CPU 时间。一旦我们创建一 个线程并启动它,它的执行便依赖于线程调度器的实现。时间分片是指将可用的 CPU 时间分配给可用的 Runnable 线程的过程。分配 CPU 时间可以基于线程优先级或者线程等待的时间。线程调度并不受到 Java 虚拟机控制,所以由应用程序来控制它是更好的选择(也就是说不要让你的程序依赖于线程的优先级)。什么是自旋?
很多 synchronized 里面的代码只是一些很简单的代码,执行时间非常快,此时等待的线程都加锁可能是一种不太值得的操作,因为线程阻塞涉及到用户态和内核态切换的问题。既然 synchronized 里面的代码执行得非常快,不妨让等待锁的线程不要被阻塞,而是在 synchronized 的边界做忙循环, 这就是自旋。如果做了多次忙循环发现还没有获得锁,再阻塞,这样可能是一种更好的策略。 Java Concurrency API 中的 Lock 接口(Lock interface)是什么?对比同步它有什么优势? Lock 接口比同步方法和同步块提供了更具扩展性的锁操作。他们允许更灵活的结构,可以具有完全不同的性质,并且可以支持多个相关类的条件对象。 它的优势有:- 可以使锁更公平。
- 可以使线程在等待锁的时候响应中断。
- 可以让线程尝试获取锁,并在无法获取锁的时候立即返回或者等待一段时间。
- 可以在不同的范围,以不同的顺序获取和释放锁。



