Java天下第1
Java后端工程师。
展开
-
Java从零开始学多线程——11.线程池及Executor框架 LinkedBlockingQueue ThreadPoolExecutor Future Callable FutureTask
为什么要使用线程池?诸如 Web 服务器、数据库服务器、文件服务器或邮件服务器之类的许多服务器应用程序都面向处理来自某些远程来源的大量短小的任务。请求以某种方式到达服务器,这种方式可能是通过网络协议(例如 HTTP、FTP )、通过 JMS队列或者可能通过轮询数据库。不管请求如何到达,服务器应用程序中经常出现的情况是:单个任务处理的时间很短而请求的数目却是巨大的。每当一个请求到达就创建一个新线程,然后在新线程中为请求服务,但是频繁的创建线程,销毁线程所带来的系统开销其实是非常大的。线程池为线程生命周期开原创 2021-01-08 14:44:47 · 288 阅读 · 0 评论 -
Java从零开始学多线程——10.并发工具类 CountDownLatch CyclicBarrier Semaphore Exchanger
CountDownLatch的使用await(),进入等待的状态countDown(),计数器减一应用场景:启动三个线程计算,需要对结果进行累加。public class CountDownLatchdEMO { public static void main(String[] args) { CountDownLatch countDownLatch = new CountDownLatch(8); new Thread(()->{原创 2021-01-06 16:51:20 · 215 阅读 · 0 评论 -
Java从零开始学多线程——9.容器
同步容器与并发容器简介同步容器Vector、HashTable -- JDK提供的同步容器类 Collections.synchronizedXXX 本质是对相应的容器进行包装同步容器类的缺点在单独使用里面的方法的时候,可以保证线程安全,但是,复合操作需要额外加锁来保证线程安全 使用Iterator迭代容器或使用使用for-each遍历容器,在迭代过程中修改容器会抛出ConcurrentModificationException异常。想要避免出现ConcurrentModificationE原创 2021-01-05 14:47:26 · 165 阅读 · 0 评论 -
Java从零开始学多线程——8.原子类
什么是原子类?一度认为原子是不可分割的最小单位,故原子类可以认为其操作都是不可分割为什么要有原子类?对多线程访问同一个变量,我们需要加锁,而锁是比较消耗性能的,JDk1.5之后, 新增的原子操作类提供了一种用法简单、性能高效、线程安全地更新一个变量的方式, 这些类同样位于JUC包下的atomic包下,发展到JDk1.8,该包下共有17个类, 囊括了原子更新基本类型、原子更新数组、原子更新属性、原子更新引用1.8新增的原子类DoubleAccumulator、DoubleAdder、LongA原创 2021-01-04 22:52:22 · 130 阅读 · 0 评论 -
Java从零开始学多线程——7.线程间的通信 wait、notify、notifyAll 等待通知经典模型之生产者消费者 使用管道流进行通信 PipedOutputStream、PipedInputS
wait、notify、notifyAll何时使用在多线程环境下,有时候一个线程的执行,依赖于另外一个线程的某种状态的改变,这个时候,我们就可以使用wait与notify或者notifyAllwait跟sleep的区别wait会释放持有的锁,而sleep不会,sleep只是让线程在指定的时间内,不去抢占cpu的资源 注意点 wait notify必须放在同步代码块中, 且必须拥有当前对象的锁,即不能取得A对象的锁,而调用B对象的wait 哪个对象wait,就得调哪个对象的notifynotify跟原创 2021-01-03 16:51:45 · 174 阅读 · 0 评论 -
Java从零开始学多线程——6.Java 锁 Lock AbstractQueuedSynchronizer ReentrantLock acquireQueued NonfairSync tryA
????锁的分类自旋锁: 线程状态及上下文切换消耗系统资源,当访问共享资源的时间短,频繁上下文切换不值得。jvm实现,使线程在没获得锁的时候,不被挂起,转而执行空循环,循环几次之后,如果还没能获得锁,则被挂起意思就是,当别的线程拿到锁进入方法执行的时候,别的锁进不来,但是他不能被挂起,开始执行空的for循环防止被挂起,如果循环完毕还没有得到锁,那么就会被挂起。 //自旋锁 public class Lock{ private boolean isLocked = false;原创 2020-12-30 20:08:17 · 260 阅读 · 0 评论 -
Java从零开始学多线程——5.线程安全性 volatile synchronized
什么是线程安全?当多个线程访问某个类,不管运行时环境采用何种调度方式或者这些线程如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类为线程安全的。----《并发编程实战》什么是线程不安全?多线程并发访问时,得不到正确的结果。从字节码角度剖析线程不安全操作javac -encoding UTF-8 ****.java 编译成 ****.classjavap -c ****.class 进行反编译,得到相应的字节码指令import java.util原创 2020-12-29 21:04:30 · 133 阅读 · 0 评论 -
Java从零开始学多线程——4.线程的优先级
线程的优先级告诉程序该线程的重要程度有多大。如果有大量线程都被堵塞,都在等候运行,程序会尽可能地先运行优先级的那个线程。 但是,这并不表示优先级较低的线程不会运行。若线程的优先级较低,只不过表示它被准许运行的机会小一些而已。线程的优先级设置可以为1-10的任一数值Thread类中定义了三个线程优先级,分别是:MIN_PRIORITY(1)、NORM_PRIORITY(5)、MAX_PRIORITY(10)一般情况下推荐使用这几个常量,不要自行设置数值。不同平台,对线程的优先级的支持不同。 编程的时原创 2020-12-28 15:03:06 · 181 阅读 · 0 评论 -
Java从零开始学多线程——3.线程的挂起、恢复和中断 stop notify suspend resume
什么是挂起线程?线程的挂起操作实质上就是使线程进入“非可执行”状态下,在这个状态下CPU不会分给线程时间片,进入这个状态可以用来暂停一个线程的运行。 在线程挂起后,可以通过重新唤醒线程来使之恢复运行为什么要挂起线程?cpu分配的时间片非常短、同时也非常珍贵。避免资源的浪费。如何挂起线程?/** * 挂起操作 * */public class SuspendDemo implements Runnable { @Override public void run() {原创 2020-12-28 14:46:26 · 198 阅读 · 0 评论 -
Java从零开始学多线程——2.如何创建线程,start()和run()的区别是什么
1.继承Thread,并重写父类的run方法public class MyThread extends Thread { @Override public void run() { System.out.println(Thread.currentThread().getName()); } public static void main(String[] args) { MyThread myThread = new MyThread(原创 2020-12-28 10:09:36 · 111 阅读 · 0 评论 -
Java从零开始学多线程——1.Java线程的几种状态
线程的状态:1.初始状态 NEW 线程刚被new出来,没有调用start()方法2.运行状态 Runnable 处于可运行状态,在jvm里执行,可能在等待来自操作系统的其他资源 //Runnable状态 Thread thread = new Thread(()->{ try { System.in.read(); } catch (IOException e) { e.printStackTrace();原创 2020-12-27 23:18:16 · 147 阅读 · 0 评论