java多,线程,池,并发
。
不要停止思考-jcn
向往美好生活
展开
-
Java线程池的工作原理
线程池源码解读随着cpu核数越来越多,不可避免的利用多线程技术以充分利用其计算能力。所以,多线程技术是服务端开发人员必须掌握的技术。线程的创建和销毁,都涉及到系统调用,比较消耗系统资源,所以就引入了线程池技术,避免频繁的线程创建...转载 2020-02-18 12:41:44 · 258 阅读 · 0 评论 -
关于阿里开发手册不让用Executor创建线程池的解释
Executors是一个工具类,直接使用Executors可以调用JDK为我们提供的线程池方法。Executors.newCachedThreadPool();//创建可缓存的线程池Executors.newFixedThreadPool(1);//创建固定大小的线程池Executors.newSingleThreadExecutor();//创建单线程池-n...转载 2020-02-17 21:28:22 · 566 阅读 · 0 评论 -
线程池的7个参数
在Java中,我们一般通过集成Thread类和实现Runnnable接口,调用线程的start()方法实现线程的启动。但如果并发的数量很多,而且每个线程都是执行很短的时间便结束了,那样频繁的创建线程和销毁进程会大大的降低系统运行的效率。线程池正是为了解决多线程效率低的问题而产生的,他使得线程可以被复用,就是线程执行结束后不被销毁,而是可以继续执行其他任务。(这里可以用tomcat做例子进行思考)...转载 2020-02-17 21:12:36 · 302 阅读 · 0 评论 -
Java线程池详解
构造一个线程池为什么需要几个参数?如果避免线程池出现OOM?Runnable和Callable的区别是什么?本文将对这些问题一一解答,同时还将给出使用线程池的常见场景和代码片段。基础知识Executors创建线程池Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nThreads),但...转载 2020-02-10 12:15:04 · 123 阅读 · 0 评论 -
Java 多线程之Daemon线程
Daemon线程是一种支持型线程,因为它主要被用作程序中后台调度以及支持性工作。这意味着,当一个Java虚拟机中不存在非Daemon线程的时候,Java虚拟机将会退出。可以通过调用Thread.setDaemon(true)将线程设置为Daemon线程。Daemon属性需要在启动线程之前设置,不能在启动线程之后设置。Daemon线程被用作完成支持性工作,但是在Java虚拟机退出时Daemon线...原创 2019-04-02 09:34:07 · 1155 阅读 · 0 评论 -
Java 多线程——等待超时模式
开发人员经常会遇到这样的方法调用场景:调用一个方法时等待一段时间(一般来说是给定一个时间段),如果该方法能够在给定的时间段之内得到结果,那么将结果立刻返回,反之,超时返回默认结果。等待/通知的经典范式,即加锁、条件循环和处理逻辑3个步骤,而这种范式无法做到超时等待。而超时等待的加入,只需要对经典范式做出非常小的改动,改动内容如下所示。假设超时时间段是T,那么可以推断出在当前时间now+T之后就会超...原创 2019-04-02 10:13:26 · 2197 阅读 · 0 评论 -
Java 线程异常处理
当多线程应用程序运行出现空指针异常,可以使用UncaughtExceptionHandler类进行捕捉,进而处理。下面通过官方文档对UncaughtExceptionHandler进一步了解:此类是Thread接口中的。描述:当线程由于未捕获的异常而即将终止时,Java虚拟机将查询线程的 UncaughtExceptionHandler使用情况 Thread.getUncaughtEx...原创 2019-03-25 16:58:39 · 1866 阅读 · 0 评论 -
Java 解决SimpleDateFormat非线程安全问题
类SimpleDateFormat是主要负责日期的转换与格式化,当在多线程的环境中,使用此类任意造成数据转换及处理的不准确,因为SimpleDateFormat类不是线程安全的。下面是官方对SimpleDateFormat的描述:1.SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。它允许格式化(日期→文本),解析(文本→日期)和规范化。2.Simpl...原创 2019-03-25 15:39:32 · 1002 阅读 · 0 评论 -
Java解决线程有序性
多数情况下,线程运行时多个线程之间执行任务的时机是无序的。下面将讲解怎么使线程具有有序性。package test.t4.t_3;public class MyThread1 extends Thread { private Object lock; private String showChar; private int showNumPosition; private int ...原创 2019-03-25 14:32:23 · 704 阅读 · 0 评论 -
Java 线程组
线程组:可以有线程对象,也可以有线程组。(ThreadGroup)线程组的作用是,可以批量的管理线程或线程组对象,有有效地对线程或线程组对象进行组织。官方文档:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/ThreadGroup.html线程对象关联线程组:1级关联。介绍:1级关联就是父对象中有...原创 2019-03-25 14:15:13 · 2017 阅读 · 0 评论 -
Java 线程的状态
官方文档:https://docs.oracle.com/en/java/javase/12/docs/api/java.base/java/lang/Thread.State.html首先我们来看看Thread类的继承结果:再来看看Thread有哪些状态呢?通过枚举常量来分析线程的状态。下面讲通过代码示例来验证枚举常量的状态值:验证NEW、RUNNABLE、TERMINA...原创 2019-03-25 10:57:09 · 139 阅读 · 0 评论 -
Java 多线程之单例模式
DCL可以解决多线程单例模式的非线程安全问题。运行结果:序列化与反序列化实现的单例模式的实现静态内置类可以达到线程安全问题,但如果遇到序列化对象时,使用默认的方式运行得到的结果还是多例的。使用static代码块实现单例模式...原创 2019-03-25 09:28:08 · 345 阅读 · 0 评论 -
Java 饿汉模式 / 懒汉模式
饿汉模式也称直接加载。立即加载就是使用类的时候已经将对象创建完毕,常见的实现方法就是直接new实例化。立即加载是调用方法前,实例已经被创建了。下面我们通过代码来了解此模式:运行结果:输出的几个都是同一个值,说明对象是同一个,也就是实现了立即加载型单例设计模式。懒汉模式也称延迟加载延迟加载就是在调用get()方法时实例才被创建,常见的实现办法就是在get()方法中进行new实例化...原创 2019-03-24 22:04:12 · 1139 阅读 · 0 评论 -
Java 超详细解释Timer定时器
首先来看看此类在JavaSE文档中对Timer类的8点解释:1.线程的工具,用于在后台线程中安排将来执行的任务。可以将任务安排为一次性执行,或者以固定间隔重复执行。2.对应于每个Timer对象的是一个后台线程,用于按顺序执行所有计时器的任务。3.计时器任务应该快速完成。4.如果计时器任务花费过多时间来完成,它会“占用”计时器的任务执行线程。反过来,这可以延迟后续任务...原创 2019-03-24 15:28:42 · 1481 阅读 · 0 评论 -
Java ReentrantReadWriteLock的使用
ReentrantReadWriteLock的使用: - 读读共享: 写写互斥: 读写互斥: 写读互斥:类ReentrantLock具有完全互斥排他的效果,即同一时间只有一个线程在执行ReentrantLock.lock()方法后面得任务。这样做虽然保证了实例变量得线程安全性,但效率却是非常底下得,所以在JDK中提供了一种读写锁ReentrantReadWriteLock类,使用它可以加快...原创 2019-03-24 13:54:12 · 1982 阅读 · 0 评论 -
Java 使用Condition实现顺序执行
使用Condition对象可以对线程执行的业务进行排序规划。package org.test.t9.t_3;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class Run { volatile private static int...原创 2019-03-24 11:14:52 · 670 阅读 · 0 评论 -
Java awaitUntil()的使用
此方法可以证明线程在等待时间达到前,可以被其他线程提前唤醒。示例:public class Service { private ReentrantLock lock = new ReentrantLock(); private Condition condition = lock.newCondition(); public void waitMethod() { try { ...原创 2019-03-24 10:21:43 · 1008 阅读 · 0 评论 -
Java awaitUninterruptibly用法
**方法await()和awaitUninterruptibly的区别**:线程在调用condition.await()后处于await状态,此时调用thread.interrupt()会报错但是使用condition.awaitUninterruptibly()后,调用thread.interrupt(0则不会报错下面用代码演示:使用方法await():使用awaitUni...原创 2019-03-24 10:21:28 · 4147 阅读 · 1 评论 -
Java 公平锁与非公平锁
公平锁与非公平锁:锁Lock分为公平锁和非公平锁。公平锁:表示线程获取锁的顺序是按照加锁的顺序来分配的,及先来先得,先进先出的顺序。非公平锁:表示获取锁的抢占机制,是随机获取锁的,和公平锁不一样的就是先来的不一定能拿到锁,有可能一直拿不到锁,所以结果不公平。公平锁实例:public class Service { private ReentrantLock lock; pub...原创 2019-03-23 22:39:44 · 6376 阅读 · 5 评论 -
Java 使用Condition实现 生产者/消费者模式
一对一交替打印:package org.test.t8.t_3;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.ReentrantLock;public class MyService { private ReentrantLock lock = new Reentrant...原创 2019-03-23 19:17:00 · 1472 阅读 · 0 评论 -
Java 使用Condition实现等待/通知
关键字synchronized与wait()和notify()/notifyAll()方法相结合可以实现等待/通知模式,类ReentrantLock也可以实现同样的功能,但想要借助于Condition对象。Condition类是再JDK5中出现的技术,使用它有更好的灵活性,比如实现多路通知功能,也就是再一个Lock对象里面可以创建多个Condition(即对象监视器)实例,线程对象可以注册在指定...原创 2019-03-23 18:50:43 · 615 阅读 · 0 评论 -
Java 使用ReentrantLock实现同步
Java5中Lock对象实现同步的效果,而且使用上更方便。1.ReentrantLock类的使用。2.ReentrantReadWriteLock类的使用。ReentrantLock能达到synchronized的效果,且扩展功能也更加强大。例如:嗅探锁定,多路分支通知等。使用ReentrantLock实现同步:package org.test.t8.t_1;import java...原创 2019-03-23 16:26:54 · 1142 阅读 · 0 评论 -
Java 类InheritableThreadLocal的使用
一、类InheritableThreadLocal的使用。使用类InheritableThreadLocal可以在子线程中取得父线程继承下来的值。1.值继承:值继承再修改:如果在继承的同时还可以对值进行进一步的处理那就更好了。往InheritableThreadLocalExt类中添加如下代码:注意:在使用InheritableThreadLocal类时,如果子线程在取...原创 2019-03-23 15:44:43 · 732 阅读 · 0 评论 -
Java ThreadLocal类的使用
一、类ThreadLocal的使用类ThreadLocal存储每一个线程的私有数据。ThreadLocal:实现每一个线程都有自己的共享变量。1.类ThreadLocal解决的是变量在不同线程间的隔离性,也就是不同线程拥有自己的值,不同线程中的值是可以放入Threadlocal类中进行保存的。方法get()与null问题:通过代码来验证线程变量的隔离性:虽然三个线程都向t...原创 2019-03-23 15:24:10 · 280 阅读 · 0 评论 -
Java 多线程join方法的使用
在很多情况下,主线程创建并启动子线程,如果子线程中要进行大量的耗时运算,主线程往往将早于子线程结束之前结束,这时,如果主线程想等待子线程执行完成之后再结束,比如子线程处理一个数据,主线程要取得这个数据中的值,就要用到join()方法了。方法join():等待线程对象销毁。作用:使所属的线程对象x正常执行run()方法中的任务,而使线程z进行无限制的阻塞,等待线程x销毁后再继续执行线程z后面...原创 2019-03-23 13:27:52 · 681 阅读 · 0 评论 -
Java多线程实战:等待/通知之交叉备份
创建20个线程,其中10个线程是将数据备份到A数据库中,另外10个线程将数据备份到B数据库中,并且备份A数据库和B数据库是交叉运行的。运行结果:打印的原理就是使用如下代码作为标记:volatile private boolean prevIsA = false;...原创 2019-03-23 10:46:34 · 242 阅读 · 0 评论 -
Java 通过管道进行线程间通信:字节流/字符流
管道流:用于不同线程间传送数据。一个线程发送数据到输出管道,另一个线程从输入管道中读数据。通过使用管道,实现不同线程间的通信,而无须借助类似临时文件之类的东西。在Java的JDK中提供了4个类来使线程间可以进行通信:PipedInputStream 和 PipedOutPutStreamPipedReader 和 PipedWriter示例:字节流输出结果:两个线程通过管...原创 2019-03-23 09:57:50 · 547 阅读 · 0 评论 -
Java 多线程等待/通知案例——生产者与消费者2
4.一生产与一消费:操作栈package org.test.t6.t_3;import java.util.ArrayList;import java.util.List;//使生产者向堆栈List对象中放入数据,使消费者从List堆栈中取出数据,最大容量是1//实验环境只有一个生产者与一个消费者public class MyStack { private List list ...原创 2019-03-22 20:37:22 · 243 阅读 · 0 评论 -
Java 多线程等待/通知案例——生产者与消费者1
- 1.一生产者与一消费者:操作值- 2.多生产者与多消费:操作值-假死- 3.多生产者与多消费:操作值- 4.一生产与一消费:操作栈- 5.一生产与多消费——操作栈:解决wait条件改变与假死- 6.多生产与一消费:操作栈- 7.多生产与多消费:操作栈原创 2019-03-22 18:53:47 · 298 阅读 · 0 评论 -
Java 使用API改变线程对象的状态
一、改变线程对象的状态:1.新创建一个新的线程对象后,再调用他的start()方法,系统会为此线程分配CPU资源,使其处于Runnable(可运行)状态,这是一个准备运行的阶段。如果线程抢占CPU资源,此线程就处于Running(运行)状态。2.Running状态和Running状态可互相切换,因为有可能线程运行一段时间后,有其他高优先级的线程抢占CPU资源,这是此线程就从Runnin...原创 2019-03-22 17:08:34 · 244 阅读 · 0 评论 -
Java 多线程之wait/notify的实现
线程间通信:1.使用wait/notify实现线程间的通信。2.生产者/消费者模式的实现3.方法join的使用4.ThreadLocal类的使用一、等待/通知机制:线程与线程之间不是独立的个体,可以相互通信和协作。1.使用sleep()结合while(true)死循环法来实现多个线程间通信。wait/notify机制来实现减少CPU的资源浪费,而且还可以实现在多个线程间通信。多个...原创 2019-03-22 09:58:46 · 836 阅读 · 0 评论 -
Java 多线程volatile关键字
通过使用volatile关键字,强制的从公共内存中读取变量的值。使用volatile关键字增加了实例变量在多个线程之间的可见性。但是volatile关键字不支持原子性。关键字synchronized和volatile进行比较:1.关键字volatile是线程同步的轻量级实现,所以volatile性能肯定比synchronized要好,并且volatile只能修饰于变量,而synch...原创 2019-03-21 11:14:12 · 210 阅读 · 0 评论 -
Java 解决多线程死循环问题
内置类与静态内置类:在内置类中有两个同步方法,但使用的却是不同的锁,打印的结果也是异步的。同步代码块synchronized(class)对class上锁后,其他线程只能以同步的方法调用class中的静态同步方法。锁对象的改变:在任何数据类型作为同步锁时,需要注意的是,是否有多个线程同时持有锁对象,如果同时持有相同的锁对象,则这些线程之间就是同步的;如果分别获取锁对象,这些线程之间就是...原创 2019-03-21 09:20:43 · 5154 阅读 · 0 评论 -
Java 使用synchronized达到多线程同步
A线程先持有object对象的Lock锁,B线程可以以异步的方式调用object对象中的非synchronized类型的方法。A线程先持有object对象的Lock锁,B线程如果在这时调用object对象中的synchronized类型 的方法则需等待,也就是同步。脏读:在读取实例变量时,此值已经被其他线程更改过了。不同线程争抢实例变量的结果。为了避免数据出现交叉的情况,使用synchro...原创 2019-03-20 12:02:57 · 198 阅读 · 0 评论 -
Java synchronized关键字
synchronized对象监视器为Object时的使用。synchronized对象监视器为Class时的使用。非线程安全是如何出现的。关键字volate的主要作用。关键字volate与synchronized的区别及使用情况。非线程安全其实会在多个线程对同一个对象中的实例变量进行并发访问时发生,产生的后果就是脏读,也就是取到的数据其实是被更改过的。二线程安全就是以获取的实例变量的值...原创 2019-03-20 08:29:25 · 239 阅读 · 0 评论 -
Java 守护线程
先sleep在interrupt()停止,和,先interrupt()停止再sleep。如果在sleep状态下停止某一线程,会进入catch语句,并且清除停止状态值,使之变成false。使用stop暴力停止线程。调用stop()方法时会抛出java.lang.ThreadDeate异常,此异常不需要显示的去捕捉。方法stop()已经作废,因为如果强制停止线程有可能使一些清理性的工作得不到完...原创 2019-03-19 15:59:24 · 366 阅读 · 0 评论 -
Java 停止线程
1.线程的启动2.如何使线程暂停3.如何使线程停止4.线程的优先级5.线程安全相关的问题线程与进程:进程:就相当于资源管理器的exe后缀的程序。线程:相当于进程中独立运行的子任务。使用多线程有什么优点呢?使用多线程可以同一时间运行更多不同种类的任务,能够更加有效的利用CPU的资源。单任务:排队执行,也就是同步,就像cmd中的命令一样,必须等待这条命令执行之后才能执行下一条命令。...原创 2019-03-19 10:48:37 · 293 阅读 · 0 评论 -
关于为什么有synchronized还要lock的回答
为什么java已经通过synchronized关键字实现同步访问了,还需要提供Lock?synchronized的缺陷前面博客有提到过释放对象的锁有两种情况:程序执行完同步代码块会释放代码块。程序在执行同步代码块是出现异常,JVM会自动释放锁去处理异常。如果获取锁的线程需要等待I/O或者调用了sleep()方法被阻塞了,但仍持有锁,其他线程只能干巴巴的等着,这样就会很影响程序效率。...转载 2020-02-17 21:14:31 · 695 阅读 · 0 评论 -
读写锁ReentrantReadWriteLock的实现原理
前言前面介绍了java中排它锁,共享锁的底层实现机制,本篇再进一步,学习非常有用的读写锁。鉴于读写锁比其他的锁要复杂,不想堆一大波的文字,本篇会试图图解式说明,把读写锁的机制用另外一种方式阐述,鉴于本人水平有限,如果哪里有误,请不吝赐教。公平读写锁ReentrantReadWriteLock的锁策略有两种,分为公平策略和非公平策略,两者有些小区别,为便于理解,本小节将以示例的形式来说明多线...转载 2020-02-16 20:36:07 · 465 阅读 · 1 评论 -
不可重入锁(自旋锁)带来的好处
什么是自旋锁多线程中,对共享资源进行访问,为了防止并发引起的相关问题,通常都是引入锁的机制来处理并发问题。获取到资源的线程A对这个资源加锁,其他线程比如B要访问这个资源首先要获得锁,而此时A持有这个资源的锁,只有等待线程A逻辑执行完,释放锁,这个时候B才能获取到资源的锁进而获取到该资源。这个过程中,A一直持有着资源的锁,那么没有获取到锁的其他线程比如B怎么办?通常就会有两种方式:1....转载 2020-02-16 20:31:11 · 3700 阅读 · 0 评论