Java并发-多线程实践
文章平均质量分 82
Java并发编程-多线程实践
OkidoGreen
这个作者很懒,什么都没留下…
展开
-
多线程调用如何传递请求上下文?简述ThreadLocal和TaskDecorator
先看官方api文档说明意思就是说这是一个执行回调方法的装饰器,主要应用于传递上下文,或者提供任务的监控/统计信息。看上去正好可以应用于我们这种场景。转载 2022-10-31 17:28:43 · 1566 阅读 · 0 评论 -
当InheritableThreadLocal遇到线程池:主线程本地变量修改后,子线程无法读取到新值
InheritableThreadLocal可以在子线程创建的时候,将父线程的本地变量拷贝到子线程中。那么问题就来了,是只有在创建的时候才拷贝,只拷贝一次,然后就放到线程中的inheritableThreadLocals属性缓存起来。由于使用了线程池,该线程可能会存活很久甚至一直存活,那么inheritableThreadLocals属性将不会看到父线程的本地变量的变化可以看到,由于两次执行复用了同一个线程,所以即使父线程的本地变量发生了改变,子线程的本地变量依旧是首次创建线程时赋的值。转载 2022-10-28 17:52:38 · 1324 阅读 · 0 评论 -
java8 新线程池 newWorkStealingPool
大家好,偶然间在论坛发现大家对于 java8 中新增的线程池说明的比较少(可能是应用的比较少)以至于可能好多人都不知道这个新的线程池的存在,所以想要发一片文章想要说明下。新的改变java8 中创建了一个新的具有抢占式操作的线程池,每个线程都有一个任务队列存放任务。区别看过源码的同学都知道之前的线程池都是通过 ThreadPoolExecutor 创建出来的。而创建参数中有一个队列参数用于存放任务。而这些队列的长度都是Integer的最大值。这就导致在实际应用中会造成内存溢出情况。这也是为什么阿里转载 2022-04-13 15:17:59 · 1402 阅读 · 1 评论 -
notify,notifyAll区别(生产者消费者案例)
区别notify:只会唤醒等待该锁的其中一个线程。notifyAll:唤醒等待该锁的所有线程。既然notify会唤醒一个线程,并获取锁,notifyAll会唤醒所有线程并根据算法选取其中一个线程获取锁,那最终结果不都是只有一个线程获取锁吗?那JDK为什么还需要做出来这两个方法呢?这两种同步方法本质上会有什么区别?这还要从对象内部锁的调度说起。对象内部锁其实,每个对象都拥有两个池,分别为锁池(EntrySet)和(WaitSet)等待池。锁池:假如已经有线程A获取到了锁,这时候又有线程B需转载 2020-07-10 18:25:46 · 1111 阅读 · 0 评论 -
并行流parallel,CompletableFuture与Executors线程池的使用与区别
list并行操作在项目开发可以极大提高代码效率与性能,java8对其进行了很好的封装,简单使用研究一下:1. 先自己创建一个list:// list在实际使用中要注意线程安全,Collections.synchronizedList写操作性能高,CopyOnWriteArrayList读操作性能较好List<String> list = Arrays.asList(new String[10000]);2. parallel并行流使用:list.stream().paral转载 2020-06-29 18:45:52 · 3966 阅读 · 0 评论 -
Java8 parallelStream —— 替换默认的共享线程池ForkJoinPool.commonPool()
Java 8 并行流(parallel stream)采用共享线程池,对性能造成了严重影响。可以包装流来调用自己的线程池解决性能问题。问题Java 8 的并行流可以让我们相对轻松地执行并行任务。myList.parallelStream.map(obj -> longRunningOperation())但是这样存在一个严重的问题:在 JVM 的后台,使用通用的 fork/join 池来完成上述功能,该池是所有并行流共享的。默认情况,fork/join 池会为每个处理器分配一个线程转载 2020-06-29 18:10:23 · 7793 阅读 · 0 评论 -
记一次生产问题--CompletableFuture默认线程池
在jdk7中,我们使用线程池可能会使用ExecutorService,默认有四种方式Executors.newSingleeThreadPool()Executors.newFixedThreadPool()Executors.newCacheThreadPool()Executors.newScheduledThreadPool()在jdk8中,CompletableFuture腾空出世,它简化了异步任务的写法,提供了很多异步任务的计算方式。言归正传,现在生产上面出现的问题是,在转载 2020-06-29 18:48:07 · 6105 阅读 · 2 评论 -
parallelStream、CompletableFuture 使用默认ForkJoinPool.commonPool()线程池的问题
parallelStream和CompletableFuture 默认使用的都是ForkJoinPool.commonPool()默认线程池;基于服务器内核的限制,如果你是八核,每次线程只能起八个,不能自定义线程池;适用于对list密集计算操作充分利用CPU资源,如果需要调用远端服务不建议使用参考:https://blog.csdn.net/z69183787/article/details/107026179https://blog.csdn.net/z69183787/a...原创 2020-06-29 18:50:52 · 5078 阅读 · 0 评论 -
Thread.sleep(0) 有什么用?
我们可能经常会用到 Thread.Sleep 函数来吧使线程挂起一段时间。那么你有没有正确的理解这个函数的用法呢?思考下面这两个问题:假设现在是 2008-4-7 12:00:00.000,如果我调用一下 Thread.Sleep(1000) ,在 2008-4-7 12:00:01.000 的时候,这个线程会不会被唤醒?某人的代码中用了一句看似莫明其妙的话:Thread.Sleep(0) 。既然是 Sleep 0 毫秒,那么他跟去掉这句代码相比,有啥区别么?我们先回顾一下操作系统原理。转载 2020-06-12 16:40:54 · 1098 阅读 · 1 评论 -
缓存击穿后单机只用一个线程命中Db策略
private ConcurrentHashMap<Integer, FutureTask<ShopDto> shopTaskMap = new ConcurrentHashMap<Integer, FutureTask<ShopDto>();public ShopDto loadShop(int shopId) { ShopDto dto = ...原创 2019-11-07 17:52:26 · 562 阅读 · 0 评论 -
如何停止一个正在运行的线程
停止一个线程意味着在任务处理完任务之前停掉正在做的操作,也就是放弃当前的操作。停止一个线程可以用Thread.stop()方法,但最好不要用它。虽然它确实可以停止一个正在运行的线程,但是这个方法是不安全的,而且是已被废弃的方法。在java中有以下3种方法可以终止正在运行的线程:使用退出标志,使线程正常退出,也就是当run方法完成后线程终止。 使用stop方法强行终止,但是不推荐这个方法,因...转载 2020-04-07 11:47:27 · 898 阅读 · 0 评论 -
守护线程(Daemon Thread)
在Java中有两类线程:用户线程 (User Thread)、守护线程 (Daemon Thread)。所谓守护 线程,是指在程序运行的时候在后台提供一种通用服务的线程,比如垃圾回收线程就是一个很称职的守护者,并且这种线程并不属于程序中不可或缺的部分。因此,当所有的非守护线程结束时,程序也就终止了,同时会杀死进程中的所有守护线程。反过来说,只要任何非守护线程还在运行,程序就不会终止。用户...转载 2020-04-07 11:14:06 · 808 阅读 · 0 评论 -
不可不说的Java“锁”事
Java提供了种类丰富的锁,每种锁因其特性的不同,在适当的场景下能够展现出非常高的效率。本文旨在对锁相关源码(本文中的源码来自JDK 8)、使用场景进行举例,为读者介绍主流锁的知识点,以及不同的锁的适用场景。Java中往往是按照是否含有某一特性来定义锁,我们通过特性将锁进行分组归类,再使用对比的方式进行介绍,帮助大家更快捷的理解相关知识。下面给出本文内容的总体分类目录:1. 乐观锁 V...转载 2019-12-06 21:13:51 · 587 阅读 · 0 评论 -
ExecutorService与Executors例子的简单剖析
对于多线程有了一点了解之后,那么来看看java.lang.concurrent包下面的一些东西。在此之前,我们运行一个线程都是显式调用了Thread的start()方法。我们用concurrent下面的类来实现一下线程的运行,而且这将成为以后常用的方法或者实现思路。 看一个简单的例子: Java代码 public class CacheThre转载 2016-11-06 17:06:44 · 1985 阅读 · 0 评论 -
java之yield(),sleep(),wait()区别详解-备忘笔记
1、sleep()使当前线程(即调用该方法的线程)暂停执行一段时间,让其他线程有机会继续执行,但它并不释放对象锁。也就是说如果有synchronized同步快,其他线程仍然不能访问共享数据。注意该方法要捕捉异常。例如有两个线程同时执行(没有synchronized)一个线程优先级为MAX_PRIORITY,另一个为MIN_PRIORITY,如果没有Sleep()方法,只有高优先级的转载 2017-03-24 14:28:30 · 1056 阅读 · 0 评论 -
线程的五大状态
线程从创建、运行到结束总是处于下面五个状态之一:新建状态、就绪状态、运行状态、阻塞状态及死亡状态。 1.新建状态(New): 当用new操作符创建一个线程时, 例如new Thread(r),线程还没有开始运行,此时线程处在新建状态。 当一个线程处于新生状态时,程序还没有开始运行线程中的代码 2.就绪状态(Runnable)转载 2017-03-24 14:39:18 · 981 阅读 · 0 评论 -
公平锁与非公平锁
总括: 在Java的ReentrantLock构造函数中提供了两种锁:创建公平锁和非公平锁(默认)。代码如下:public ReentrantLock() {sync = new NonfairSync();}在公平的锁上,线程按照他们发出请求的顺序获取锁,但在非公平锁上,则允许‘插队’:当一个线程请求非公平锁时,如果在发出请求的转载 2016-03-24 14:08:55 · 5078 阅读 · 1 评论 -
Java高效并发之乐观锁悲观锁、(互斥同步、非互斥同步)
http://m.blog.csdn.net/truelove12358/article/details/54963791乐观锁和悲观锁首先我们理解下两种不同思路的锁,乐观锁和悲观锁。这两种锁机制,是在多用户环境并发控制的两种所机制。下面看百度百科对乐观锁和悲观锁两种锁机制的定义:乐观锁( Optimistic Locking ) 相对悲观锁转载 2017-09-13 11:53:01 · 1295 阅读 · 0 评论 -
JAVA进阶----ThreadPoolExecutor机制
http://825635381.iteye.com/blog/2184680ThreadPoolExecutor机制 一、概述 1、ThreadPoolExecutor作为java.util.concurrent包对外提供基础实现,以内部线程池的形式对外提供管理任务执行,线程调度,线程池管理等等服务; 2、Executors方法提供的线程服务,都是通过参数设置来实现不同的转载 2017-12-06 19:24:11 · 708 阅读 · 0 评论 -
Java并发编程与技术内幕:ThreadGroup线程组应用
https://blog.csdn.net/evankaka/article/details/51627380 摘要:线程组ThreadGroup表示一组线程的集合,一旦一个线程归属到一个线程组之中后,就不能再更换其所在的线程组。那么为什么要使用线程组呢?个人认为有以下的好处:方便统一管理,线程组可以进行复制,快速定位到一个线程,统一进行异常设置等。ThreadGroup它其实并不属于Java...转载 2018-08-05 15:45:32 · 682 阅读 · 0 评论 -
java异步计算Future的使用
从jdk1.5开始我们可以利用Future来跟踪异步计算的结果。在此之前主线程要想获得工作线程(异步计算线程)的结果是比较麻烦的事情,需要我们进行特殊的程序结构设计,比较繁琐而且容易出错。有了Future我们就可以设计出比较优雅的异步计算程序结构模型:根据分而治之的思想,我们可以把异步计算的线程按照职责分为3类:1. 异步计算的发起线程(控制线程):负责异步计算任务的分解和发起,把分解好的任务...转载 2014-05-28 19:56:04 · 1912 阅读 · 0 评论 -
关于Future.cancel(false)
https://blog.csdn.net/StefanTimber/article/details/73823689前言在学习Future接口的过程中,注意到它具有一个cancel()方法,用于取消异步的任务,它传入一个boolean类型的参数,传入true会中断线程停止任务,而传入false则会让线程正常执行至完成,并返回false。 由此让我产生了疑问,false参数并不会停止任务,...转载 2019-02-26 11:56:45 · 2653 阅读 · 1 评论 -
threadPoolExecutor 中的 shutdown() 、 shutdownNow() 、 awaitTermination() 的用法和区别
最近在看并发编程,在使用到ThreadPoolExecutor时,对它的三个关闭方法(shutdown()、shutdownNow()、awaitTermination())产生了兴趣,同时又感到迷惑。查了些资料,自己写了测试代码,总算有了个比较清晰的认识。下面一起来看看这三个方法:shutdown()将线程池状态置为SHUTDOWN,并不会立即停止:停止接收外部submit的任务内部...转载 2019-06-07 11:50:06 · 8659 阅读 · 1 评论 -
利用Future异步获取多线程的返回结果
Future接口是Java标准API的一部分,在java.util.concurrent包中。Future接口是Java线程Future模式的实现,可以来进行异步计算。有了Future就可以进行三段式的编程了,1.启动多线程任务2.处理其他事3.收集多线程任务结果。从而实现了非阻塞的任务调用。在途中遇到一个问题,那就是虽然能异步获取结果,但是Future的结果需要通过isdone来判断是否有结转载 2016-10-24 14:46:57 · 16930 阅读 · 3 评论 -
Promise模式简介(Future) --- Java实现异步
Promise模式简介Promise模式是一种异步编程模式 。它使得我们可以先开始一个任务的执行,并得到一个用于获取该任务执行结果的凭据对象,而不必等待该任务执行完毕就可以继续执行其他操作。等到我们需要该任务的执行结果时,再调用凭据对象的相关方法来获取。这样就避免了不必要的等待,增加了系统的并发性。这好比我们去小吃店,同时点了鸭血粉丝汤和生煎包。当我们点餐付完款后,我们拿到手的其实只是一张转载 2016-10-24 15:26:28 · 2380 阅读 · 0 评论 -
java并发编程-Executor框架+Future
Executor框架是指java 5中引入的一系列并发库中与executor相关的一些功能类,其中包括线程池,Executor,Executors,ExecutorService,CompletionService,Future,Callable等。他们的关系为:并发编程的一种编程方式是把任务拆分为一些列的小任务,即Runnable,然后在提交给一个Executor执行,Execu转载 2016-10-24 15:11:59 · 1210 阅读 · 0 评论 -
使用ThreadLocal解决多线程的并发问题
早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。从线程的角度转载 2014-08-07 18:03:58 · 3327 阅读 · 0 评论 -
Callable接口和Runnable接口
Callable接口和Runnable接口相似,区别就是Callable需要实现call方法,而Runnable需要实现run方法;并且,call方法还可以返回任何对象,无论是什么对象,JVM都会当作Object来处理。但是如果使用了泛型,我们就不用每次都对Object进行转换了。 Runnable和Callable都是接口不同之处:1.Callable可以返回一个类型转载 2014-06-05 16:23:25 · 1314 阅读 · 0 评论 -
Java Callable用法
Callable 和 Runnable 的使用方法大同小异, 区别在于: 1.Callable 使用 call() 方法, Runnable 使用 run() 方法 2.call() 可以返回值, 而 run()方法不能返回。 3.call() 可以抛出受检查的异常,比如ClassNotFoundException, 而run()不能抛出受检查的异常。 Callable示例如下:转载 2014-06-05 16:22:25 · 4639 阅读 · 0 评论 -
java 创建线程的三种方法Callable,Runnable,Thread比较及用法
编写多线程程序是为了实现多任务的并发执行,从而能够更好地与用户交互。一般有三种方法,Thread,Runnable,Callable. Runnable和Callable的区别是,(1)Callable规定的方法是call(),Runnable规定的方法是run().(2)Callable的任务执行后可返回值,而Runnable的任务是不能返回值得(3)ca转载 2014-06-05 14:59:47 · 2250 阅读 · 0 评论 -
java并发(一)wait,notify的使用
Java是第一个内置对多线程支持的主流编程语言。在Java5之前,对多线程的支持主要是通过对块结构的同步实现的(synchronized配合wait,notify,notifyAll),Java5引入了java.util.concurrent包,提供了对多线程编程的更高层的支持。在Java中,除了int等基本类型之外,一切皆为对象。synchronized关键字以及Object类中的wai转载 2014-03-24 20:48:11 · 1701 阅读 · 0 评论 -
由生产者/消费者问题看JAVA多线程
生产者消费者问题是研究多线程程序时绕不开的问题,它的描述是有一块生产者和消费者共享的有界缓冲区,生产者往缓冲区放入产品,消费者从缓冲区取走产品,这个过程可以无休止的执行,不能因缓冲区满生产者放不进产品而终止,也不能因缓冲区空消费者无产品可取而终止。 解决生产者消费者问题的方法有两种,一种是采用某种机制保持生产者和消费者之间的同步,一种是在生产者和消费者之间建立一个管道。前一种有转载 2014-03-24 20:56:54 · 1328 阅读 · 0 评论 -
Java synchronized详解
第一篇:使用synchronized在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题。在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用。我们首先编写一个非常简单的多线程的程序,是模拟银行中的多个线程同时对同一个储蓄账户进行存款、取款操作的。在程序中我们使用了一个简化版本的Account类,转载 2014-03-24 21:04:08 · 1036 阅读 · 0 评论 -
最简实例说明wait、notify、notifyAll的使用方法
/*** 转载请注明作者longdick http://longdick.iteye.com**/ wait()、notify()、notifyAll()是三个定义在Object类里的方法,可以用来控制线程的状态。这三个方法最终调用的都是jvm级的native方法。随着jvm运行平台的不同可能有些许差异。 如果对象调用了w转载 2013-03-07 16:21:57 · 1291 阅读 · 0 评论 -
JAVA wait(), notify(),sleep详解
在JAVA中,是没有类似于PV操作、进程互斥等相关的方法的。JAVA的进程同步是通过synchronized()来实现的,需要说明的是,JAVA的synchronized()方法类似于操作系统概念中的互斥内存块,在JAVA中的Object类型中,都是带有一个内存锁的,在有线程获取该内存锁后,其它线程无法访问该内存,从而实现JAVA中简单的同步、互斥操作。明白这个原理,就能理解为什么synchron转载 2013-03-07 16:18:41 · 1281 阅读 · 0 评论 -
java join的用法
join的用法,先看几个例子在说。 程序1:public class ThreadTest implements Runnable { public static int a = 0; public synchronized void inc() { a++; } public void run() { for (int转载 2014-04-09 11:27:56 · 12617 阅读 · 0 评论 -
java多线程之 wait(),notify(),notifyAll()[迁]
wait(),notify(),notifyAll()不属于Thread类,而是属于Object基础类,也就是说每个对像都有wait(),notify(),notifyAll()的功能.因为都个对像都有锁,锁是每个对像的基础,当然操作锁的方法也是最基础了。 wait导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或被其他线程中断。wai转载 2012-12-17 11:11:45 · 1206 阅读 · 0 评论 -
Java 5.0多线程编程
概述1:三个新加的多线程包2:Callable 和 Future接口3:新的线程执行架构4:Lockers和Condition接口5: Synchronizer:同步装置6: BlockingQueue接口7:Atomics 原子级变量8:Concurrent Collections 共点聚集概述:Java自1995年面世以来得到了广泛得一个运用,但是对转载 2014-01-16 13:07:17 · 1202 阅读 · 1 评论 -
Java 得到 执行方法 是否超时
package com.cmb.util;import java.util.concurrent.*;public class MethodOver { public static void main(String[] args) { Executor executor= Executors.newSingleThreadExecutor(); F转载 2015-06-12 16:08:33 · 1973 阅读 · 0 评论 -
synchronized和ReentrantLock区别
一.什么是sychronizedsychronized是java中最基本同步互斥的手段,可以修饰代码块,方法,类.在修饰代码块的时候需要一个reference对象作为锁的对象.在修饰方法的时候默认是当前对象作为锁的对象.在修饰类时候默认是当前类的Class对象作为锁的对象.synchronized会在进入同步块的前后分别形成monitorente转载 2015-09-13 21:29:01 · 2229 阅读 · 0 评论