
Java并发编程
ly_dsjing
这个作者很懒,什么都没留下…
展开
-
线程间协作的两种方式
文章目录1 wait(),notify(),notifyAll2 Condition3 生产者-消费者模型的实现3.1 使用Object的wait()和notify()实现3.2 使用 Condition 实现参考资料线程间互相通信的过程,就是线程间的协作Java中,线程协作的两种常见方式:Object.wait(),Object.notify()Condition1 wait(),notify(),notifyAllwait(),notify(),notifyAll() 是 Object原创 2020-07-13 17:12:44 · 485 阅读 · 0 评论 -
Timer和TimerTask
文章目录1 概述2 Timer 的 常见方法3 Timer() 的 构造方法4 示例参考文章1 概述Timer 就是一个调度器,TimerTask 是一个实现了 run() 方法 的 一个类,具体的 TimerTask 需要自己来实现Timer timer = new Timer();timer.schedule(new TimerTask() { public void run() { System.out.println("abc"); }},20000,原创 2020-07-13 15:21:32 · 360 阅读 · 1 评论 -
Callable,Future,FutureTask
文章目录1 Callable 与 Runnable2 Future3 FutureTask4 使用示例4.1 使用 Callable+Future 获取执行结果4.2 使用 Callable+FutureTask 获取执行结果创建线程的两种方式:直接 继承 Thread实现 Runnable 接口这两种方式都有一个缺陷:在执行完任务之后无法获取执行结果。如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。1 Callable 与 Runnable原创 2020-07-10 17:21:31 · 159 阅读 · 0 评论 -
CountDownLatch,CyclicBarrier,Semaphor
文章目录1 概述2 CountDownLatch 用法3 CyclicBarrier 用法3.1 常规用法3.2 在所有线程写入操作完之后,进行额外的其他操作3.3 为 await() 指定时间的效果1 概述CountDownLatch 和 CyclicBarrier 都能够 实现线程之间的等待 ,只不过它们侧重点不同CountDownLatch 一般用于 某个线程 A等待若干个其他线程执行完任务之后,它才执行CyclicBarrier 一般用于 一组线程 互相等待至某个状态,然后这一组线程原创 2020-07-10 16:10:26 · 137 阅读 · 0 评论 -
Java并发编程:阻塞队列
文章目录1 几种主要的阻塞队列2 阻塞与非阻塞队列中的方法3 阻塞队列的实现原理4 示例和应用场景参考文章非阻塞队列,如 PriorityQueue,LinkedList (双向链表,实现了 Dequeue接口),使用的时候有一个很大的问题:它不会对当前线程产生阻塞,那么在面对 消费者-生产者模型 时,就必须额外的 实现同步策略 以及 线程间唤醒策略。这个实现起来非常麻烦。阻塞队列会对当前线程产生阻塞,比如一个线程从一个 空的阻塞队列中取元素,此时线程会 被阻塞 直到阻塞队列中有了元素。当队列中有元素原创 2020-07-09 17:08:17 · 154 阅读 · 0 评论 -
Java并发容器
Java并发容器ConcurrentHashMapCopyOnWrtiteArrayList原创 2020-07-09 15:50:41 · 159 阅读 · 0 评论 -
Java ConcurrentModificationException异常原因和解决方法
文章目录1 ConcurrentModificationException异常 出现的原因2 在单线程环境下的解决办法参考资料1 ConcurrentModificationException异常 出现的原因public class Test { public static void main(String[] args) { ArrayList<Integer> list = new ArrayList<Integer>(); list.add原创 2020-07-09 12:16:55 · 392 阅读 · 0 评论 -
Java并发编程:同步容器
文章目录1 为什么会出现同步容器2 Java中的 同步类容器3 同步容器的缺陷3.1 性能问题3.2 同步容器安全性问题3.3 ConcurrentModificationException异常参考资料为了方便编写出线程安全的程序,Java里面提供了一些线程安全类和并发工具,比如:同步容器、并发容器、阻塞队列、Synchronizer(比如CountDownLatch)。下面来讨论一下同步容器1 为什么会出现同步容器在 Java的 集合容器框架 中,主要有 4大类别:List, Set, Queue原创 2020-07-09 11:44:54 · 208 阅读 · 0 评论 -
ThreadLocal
文章目录1 ThreadLocal 的 理解参考资料1 ThreadLocal 的 理解ThreadLocal 线程本地变量,线程本地存储。ThreadLocal 为变量在每个线程中都创建了一个副本,那么每个线程都可以访问自己内部的副本变量...原创 2020-07-08 12:09:10 · 144 阅读 · 0 评论 -
Lock锁的方法使用
文章目录1 Lock1.1 lock() 方法1.2 tryLock()方法与 tryLock(long time, TimeUnit unit)方法1.3 lockInterruptibly() 方法2 ReentrantLock2.1 lock() 的 正确使用方法2.2 tryLock()的使用方法2.3 lockInterruptibly() 响应中断的使用方法3 ReadWriteLock4 ReentrantReadWriteLock1 Lock通过查看 Lock 的源码可知原创 2020-07-06 17:32:00 · 3144 阅读 · 0 评论 -
Java并发编程:Lock
文章目录1 synchronized 的 缺陷2 Lock 和 synchronized 的 选择3 锁的相关概念介绍3.1 可重入锁3.2 可中断锁3.3 公平锁3.4 读写锁参考资料1 synchronized 的 缺陷如果一个代码块被 synchronized 修饰了,当一个线程获取了对应的锁,并执行该代码块时,其他线程便只能一直等待,等待获取锁的线程释放锁,而这里获取锁的线程释放锁只会有两种情况:获取锁的线程执行完了该代码块,然后线程释放对锁的占有 — 正常释放线程执行发生异常,原创 2020-07-06 16:19:39 · 171 阅读 · 0 评论 -
Java中的类锁和对象锁
参考资料文章目录1 概述2 相关定义3 注意点1 概述在 Java中,synchronized关键字是用来 控制线程同步 的,即 在多线程的环境下,控制 synchronized代码段不被多个线程同时执行。synchronized既可以加在一段代码上,也可以加在方法上。2 相关定义类锁:在代码中的 方法上 增加 static synchronized 的锁,或者 synchronized(xxx.class) 的代码段对象锁:在代码的 方法上 增加 synchronized 的锁,或者 syn原创 2020-07-06 10:56:01 · 247 阅读 · 0 评论 -
interrupt() interrupted() isInterrupted()
interrupt() 是给线程设置中断标志,线程仍会继续运行interrupted() 是检测中断并清除中断状态,第二次再调用时中断状态已被清除,将返回一个 falseisInterrupted() 只检测中断,不清除中断状态interrupted() 作用于当前线程(主线程),interrupt(),isInterrupted() 作用于此线程,即代码中调用此方法的实例所代表的线程public class InterruptTest { public static void mai.原创 2020-07-01 16:40:34 · 212 阅读 · 0 评论 -
Thread类的使用
文章目录1 线程的状态2 上下文切换3 Thread类中的常用方法3.1 start() 方法3.2 run() 方法3.3 sleep() 方法3.4 yield() 方法3.5 join() 方法3.6 interrupt() 方法3.7 stop()方法 destroy()方法3.8 有关线程属性的几个方法4 Thread类中方法的调用对线程状态变化的影响1 线程的状态线程的状态包括:创建(new) 就绪(runnable) 运行(running) 阻塞(blocked , time w原创 2020-06-30 17:19:06 · 818 阅读 · 0 评论 -
线程的创建和多线程
文章目录1 Java中关于应用程序和进程相关的概念2 线程的特点3 线程的创建3.1 继承Thread类创建线程类3.2 实现 Runnable接口3.3 两种继承方式的区别4 多线程有几种实现同步方法 ?5 产生死锁的原因6 避免死锁1 Java中关于应用程序和进程相关的概念在Java中,一个应用程序对应着一个JVM实例(也有地方称为JVM进程),一般来说名字默认为java.exe或者javaw.exe(windows下可以通过任务管理器查看)。Java采用的是 单线程编程模型,即在 我们自己的程序原创 2020-06-30 16:43:20 · 677 阅读 · 0 评论 -
Java进程和线程
文章目录1 进程和线程出现的原因2 进程和线程的区别3 优缺点4 并发与并行1 进程和线程出现的原因最初,计算机只能接受一些特定的指令,用户输入一个指令,计算机就做一个操作。效率低下,出现了 批处理操作,但是,原来都是只有一个程序在计算机里运行 — 即 内存中始终只有一个程序的运行数据。进程的出现,就是为了让 内存中可以装多个程序(进程),每个进程对应着一定的内存地址空间。并且只能使用它自己的内存空间,各个进程间互不干扰。并且进程保存了程序每个时刻的运行状态,这样就为进程切换提供了可能。进程的出现原创 2020-06-30 16:11:33 · 220 阅读 · 0 评论 -
volatile 关键字
文章目录1 volatile关键字的两层语义2 volatile不能保证原子性3.volatile能保证有序性吗?4 使用volatile关键字的场景4.1 状态标记量4.2 double check1 volatile关键字的两层语义一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的禁止进行指令重排序先看一段代码,假如线程1先执行,线程2后原创 2020-06-23 12:00:05 · 223 阅读 · 0 评论 -
Java内存模型
文章目录1 概述1 原子性3 可见性4 有序性1 概述在Java虚拟机规范中试图定义一种Java内存模型(Java Memory Model,JMM)来屏蔽各个硬件平台和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java内存模型 定义了程序中变量的访问规则 ,往大一点说是 定义了程序执行的次序。为了获得较好的执行性能,Java内存模型并没有限制执行引擎使用处理器的寄存器或者高速缓存来提升指令执行速度,也没有限制编译器对指令进行重排序。也就是说,在 java原创 2020-06-22 16:45:56 · 185 阅读 · 0 评论