![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
并发编程
jx_ming
这个作者很懒,什么都没留下…
展开
-
并发队列
并发队列ConcurrentLinkedQueue(非阻塞式队列)、BlockingQueue(阻塞式队列)区别:入列:阻塞式队列入队,超过队列总数,会阻塞(进行等待)。出列:阻塞式队列出列,队列为空时,会阻塞(进行等待)。队列:先进先出、后进后出栈:先进后出,后进先出阻塞队列ArrayDeque、PriorityQueue、ConcurrentLinkedQueue非阻塞队列...原创 2019-06-21 17:32:26 · 125 阅读 · 0 评论 -
CAS操作
什么是CAS?CAS:Compare And Swap,即比较再交换。是 JDK 提供的非阻塞原子性操作,他通过硬件保证了比较——更新操作的原子性。JDK 里面的 Unsafe 类提供了一系列的 compareAndSwap* 方法。CAS 算法理解与锁相比,使用比较交换会使程序看起来更加复杂一些。但由于其非阻塞性,它对死锁问题天生免疫,并且线程间的相互影响也远远比基于锁的方式要小。更为重...原创 2019-07-19 14:56:43 · 163 阅读 · 0 评论 -
Java 指令重排序
Java 指令重排序Java 内存模型运行编译器和处理器对指令重排序以提高运行性能,并且只会对不存在数据依赖性的指令重排序。在单线程下可以保证最终的结果与程序顺序执行的结果一致,但是在多线程下就会存在问题。例如:int a = 1;(1)int b = 2;(2)int c = a + b;(3)在上面代码中,变量 c 的值依赖 a 和 b 的值,所以重排序后能够保证 (3) 的操作...原创 2019-07-24 10:41:36 · 706 阅读 · 0 评论 -
守护线程与用户线程
Java 中的线程分为两类:daemon 线程(守护线程)和 user 线程(用户线程)。在 JVM 启动时会调用 main 函数,main 函数所在的线程就是一个用户线程,在 JVM 内部同时还启动了很多守护线程,比如垃圾回收线程。守护线程和用户线程的区别当最后一个非守护线程结束时,JVM 会正常退出,不管当前是否有守护线程,也就是说守护线程是否结束并不影响 JVM退出。言外之意,只要有一...原创 2019-07-16 09:32:29 · 102 阅读 · 0 评论 -
join方法
在项目实践中经常会遇到一个场景,就是需要等待某几件事情完成后才能继续往下执行,比如多个线程全部加载完毕再汇总处理。Thread 类中有一个 join 方法可以做这个事情,等待通知方法是 Object 类中的方法,而 join 方法则是 Thread 类直接提供的。join 是无参且返回值为 void 的方法。public class JoinTest { public static v...原创 2019-07-12 11:02:55 · 214 阅读 · 0 评论 -
线程通知与等待
wait() 函数当一个线程调用一个共享变量的 wait() 方法时,该调用线程会被阻塞挂起,直到发生下面几件事情之一才返回。其他线程调用了该共享对象的 notify() 或者 notify() 方法;其他线程调用了该线程的 interrupt() 方法,该线程抛出 InterruptedException 异常返回。注意:如果调用 wait() 方法的线程没有事先获取该对象的监视器锁...原创 2019-07-12 10:48:52 · 204 阅读 · 0 评论 -
InheritableThreadLocal 类
如何使子线程能访问到父线程中的值?使用 InheritableThreadLocal 类。InheritableThreadLocal 继承自 ThreadLocal,提供了一个特性,就是让子线程可以访问父线程中设置的本地变量。public class InheritableThreadLocal<T> extends ThreadLocal<T> { ...原创 2019-07-16 10:08:29 · 91 阅读 · 0 评论 -
ThreadLocal
多线程访问同一个共享变量时特别容易出现并发问题,特别是在多个线程需要对一个共享变量进行写入时。为了保证线程安全,一般使用者在访问共享变量时需要进行适当的同步。同步的措施一般是加锁,需要使用者对锁有一定的了解,加重了使用者的负担。ThreadLocal 是 JDK 包提供的,它提供了线程本地变量,如果你创建了一个 ThreadLocal 变量,那么访问这个变量的每个线程都会有这个变量的一个本地副...原创 2019-07-16 09:52:46 · 94 阅读 · 0 评论 -
线程的创建与运行
什么是线程?线程是进程中的一个实体,线程本身不会独立存在的。进程是代码再数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,线程则是进程的一个执行路径,一个进程中至少有一个线程,进程中的多个线程共享进程的资源。线程创建与运行Java 中有三种线程创建方式:实现 Runnable 接口的 run 方法继承 Thread 类并重写 run 方法使用 FutureTask 方式...原创 2019-07-11 18:01:48 · 217 阅读 · 0 评论 -
线程死锁
什么是线程死锁?死锁是指两个或两个以上的线程在执行过程中,因争夺资源而造成的互相等待的现象,在无外力作用的情况下,这些线程会一直相互等待而无法继续执行下去。死锁产生必须具备的四个条件:互斥条件:指线程对已经获取到的资源进行排他性使用,即该资源同时只由一个线程占用。如果此时还有其他线程请求获取该资源,则请求者只能等待,直至占有资源的线程释放该资源。请求并持有条件:指一个线程已经持有了至少...原创 2019-07-15 18:08:53 · 228 阅读 · 0 评论 -
线程中断interrupt
Java 钟的线程中断是一种线程间的协作模式,通过设置线程的中断标志不能直接终止该线程的执行,而是被中断的线程根据状态自行处理。void interrupt() 方法:中断线程例如:当线程 A 运行时,线程 B 可以调用线程 A 的 interrupt() 方法来设置线程 A 的中断标志为 true 并立即返回。设置标志仅仅是设置标志,线程 A 实际并没有被中断,它会继续往下执行。如果线程 A...原创 2019-07-15 17:59:00 · 193 阅读 · 0 评论 -
sleep 与 yield
Thread 类中有一个静态的 sleep 方法,当一个执行中的线程调用了 Thread 的 sleep 方法后,调用线程会暂时让出指定时间的执行权,也就是在这期间不参与 CPU 的调度,但是该线程所拥有的监视器资源,比如锁还是持有不让出的。指定的睡眠时间到了后该函数就会正常返回,线程就处于就绪状态,然后参与 CPU 调度,获取到 CPU 资源后就可以继续执行了...原创 2019-07-15 17:25:18 · 553 阅读 · 0 评论 -
Unsafe类
JDK 的 rt.jar 包中的 Unsafe 类提供了硬件级别的原子性操作,Unsafe 类中的方法都是 native 方法,他们使用 JNI 的方式访问本地 C++ 实现库。long objectFieldOffset(Field var1):返回指定的变量在所属类中的内存偏移地址,该偏移地址仅仅在该 Unsafe 函数中访问字段时使用。int arrayBaseOffset(Cl...原创 2019-07-19 15:22:26 · 132 阅读 · 0 评论