
多线程
jacljh
程序匠人
展开
-
并发编程 06—— CompletionService :Executor 和 BlockingQueue
Java并发编程实践 目录并发编程 01—— ThreadLocal并发编程 02—— ConcurrentHashMap并发编程 03—— 阻塞队列和生产者-消费者模式并发编程 04—— 闭锁CountDownLatch 与 栅栏CyclicBarrier并发编程 05—— Callable和Future并发编程 06—— CompletionService : Exec...转载 2019-08-17 15:49:54 · 237 阅读 · 0 评论 -
Java内存模型
ava内存模型规范了Java虚拟机与计算机内存是如何协同工作的。Java虚拟机是一个完整的计算机的一个模型,因此这个模型自然也包含一个内存模型——又称为Java内存模型。如果你想设计表现良好的并发程序,理解Java内存模型是非常重要的。Java内存模型规定了如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量。原始的Java内存模型存在一些不足,因此Jav...转载 2019-08-02 23:22:19 · 232 阅读 · 0 评论 -
面试官:你分析过线程池源码吗?
为什么要用线程池?简洁的答两点就行。 降低系统资源消耗。 提高线程可控性。 如何创建使用线程池?JDK8提供了五种创建线程池的方法:1.创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。publicstaticExecutorServicenewFixedThreadPool(intnThreads){returnn...转载 2019-07-20 23:46:39 · 129 阅读 · 0 评论 -
Java面试题-多线程篇十三
121,什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒。122,线程和进程有什么区别?线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不...转载 2019-07-24 23:29:06 · 159 阅读 · 0 评论 -
Java学习网站
Java知音:https://www.javazhiyin.com/原创 2019-07-20 12:10:26 · 196 阅读 · 0 评论 -
Jmeter下载安装及基本使用
本文将讲述Jmeter的下载安装,并以一个实例来讲解如何使用Jmeter。一、Jmeter下载及安装部署下载解压JMeter压缩包下载地址: http://jmeter.apache.org/download_jmeter.cgiJMeter解压之后,…\apache-jmeter-4.0\bin\jmeter.bat,打开直接使用,无需安装。下载安装JDK下载地址:http://w...转载 2019-06-20 23:33:23 · 371 阅读 · 0 评论 -
Jmeter性能测试案例
一、测试需求:测试20个用户访问网站在负载达到30QPS时的平均响应时间二、QPS:Query Per Second 每秒查询率。(一台查询服务器每秒能够处理的查询次数,作为域名服务器的性能经常用每秒查询率来衡量)三、测试步骤1、添加线程组(线程数+准备时长+循环次数)1)线程数:虚拟用户数,一个虚拟用户占用一个进程或线程(设置多少个虚拟用户=设置多少个线程)2)准备时长(s)...转载 2019-06-22 09:11:37 · 1164 阅读 · 0 评论 -
Jmeter接口测试+压力测试
jmeter是apache公司基于java开发的一款开源压力测试工具,体积小,功能全,使用方便,是一个比较轻量级的测试工具,使用起来非常简单。因为jmeter是java开发的,所以运行的时候必须先要安装jdk才可以。jmeter是免安装的,拿到安装包之后直接解压就可以使用,同时它在linux/windows/macos上都可以使用。 jmeter可以做接口测试和压力测试。其中接口测试的简单操...转载 2019-06-22 10:08:15 · 421 阅读 · 0 评论 -
Java多线程系列目录(共43篇)
最近,在研究Java多线程的内容目录,将其内容逐步整理并发布。(一) 基础篇01.Java多线程系列--“基础篇”01之 基本概念02.Java多线程系列--“基础篇”02之 常用的实现多线程的两种方式03.Java多线程系列--“基础篇”03之 Thread中start()和run()的区别04.Java多线程系列--“基础篇”04之 synchronized关键字...转载 2019-06-22 12:19:39 · 128 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”01之 线程池架构
概要前面分别介绍了"Java多线程基础"、"JUC原子类"和"JUC锁"。本章介绍JUC的最后一部分的内容——线程池。内容包括:线程池架构图线程池示例转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509903.html线程池架构图线程池的架构图如下:ScheduledThreadPoolExecutor继承Thread...转载 2019-06-22 13:22:40 · 142 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”02之 线程池原理 —— 线程池数据结构及调度
概要在上一章"Java多线程系列--“JUC线程池”01之 线程池架构"中,我们了解了线程池的架构。线程池的实现类是ThreadPoolExecutor类。本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理。内容包括:ThreadPoolExecutor简介ThreadPoolExecutor数据结构线程池调度转载请注明出处:http://www.cnblogs....转载 2019-06-22 14:45:47 · 280 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”03之 线程池原理——线程池源码分析
概要在前面一章"Java多线程系列--“JUC线程池”02之 线程池原理(一)"中介绍了线程池的数据结构,本章会通过分析线程池的源码,对线程池进行说明。内容包括:线程池示例参考代码(基于JDK1.7.0_40)线程池源码分析 (一) 创建“线程池” (二) 添加任务到“线程池” (三) 关闭“线程池”转载请注明出处:http://www.cnblogs.com/skywa...转载 2019-06-22 15:41:06 · 2744 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”04之 线程池原理——线程池的五种状态
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3509960.html本章介绍线程池的生命周期。在"Java多线程系列--“基础篇”01之 基本概念"中,我们介绍过,线程有5种状态:新建状态,就绪状态,运行状态,阻塞状态,死亡状态。线程池也有5种状态;然而,线程池不同于线程,线程池的5种状态是:Running,SHUTDOWN,STOP,...转载 2019-06-23 13:43:49 · 190 阅读 · 0 评论 -
Java同步块
Java 同步块(synchronized block)用来标记方法或者代码块是同步的。Java同步块用来避免竞争。本文介绍以下内容:Java同步关键字(synchronzied) 实例方法同步 静态方法同步 实例方法中同步块 静态方法中同步块 Java同步示例Java同步关键字(synchronized)Java中的同步块用synchronized标记。同步块在Jav...转载 2019-08-02 23:25:33 · 139 阅读 · 0 评论 -
Java基础面试题及答案解析(10)
概括的解释下线程的几种状态 就绪(Runnable):线程准备运行,不一定立马就能开始执行。 运行中(Running):进程正在执行线程的代码。 等待中(Waiting):线程处于阻塞的状态,等待外部的处理结束。 睡眠中(Sleeping):线程被强制睡眠。 I/O阻塞(Blocked on I/O):等待I/O操作完成。 同步阻塞(B...转载 2019-08-02 23:38:20 · 187 阅读 · 0 评论 -
竞态条件与临界区
在同一程序中运行多个线程本身不会导致问题,问题在于多个线程访问了相同的资源。如,同一内存区(变量,数组,或对象)、系统(数据库,web services等)或文件。实际上,这些问题只有在一或多个线程向这些资源做了写操作时才有可能发生,只要资源没有发生变化,多个线程读取相同的资源就是安全的。多线程同时执行下面的代码可能会出错:public class Counter { prote...转载 2019-07-30 18:15:59 · 144 阅读 · 0 评论 -
并发编程 05—— Callable和Future
Java并发编程实践 目录并发编程 01—— ThreadLocal并发编程 02—— ConcurrentHashMap并发编程 03—— 阻塞队列和生产者-消费者模式并发编程 04—— 闭锁CountDownLatch 与 栅栏CyclicBarrier并发编程 05—— Callable和Future并发编程 06—— CompletionService : Exec...转载 2019-08-17 15:36:04 · 182 阅读 · 0 评论 -
嵌套管程锁死
原文链接 作者:Jakob Jenkov译者:余绍亮 校对:丁一嵌套管程锁死类似于死锁, 下面是一个嵌套管程锁死的场景:线程1获得A对象的锁。线程1获得对象B的锁(同时持有对象A的锁)。线程1决定等待另一个线程的信号再继续。线程1调用B.wait(),从而释放了B对象上的锁,但仍然持有对象A的锁。线程2需要同时持有对象A和对象B的锁,才能向线程1发信号。线程2...转载 2019-08-06 11:42:39 · 148 阅读 · 0 评论 -
Java中的锁
Java中的锁原文链接作者:Jakob Jenkov译者:申章校对:丁一锁像synchronized同步块一样,是一种线程同步机制,但比Java中的synchronized同步块更复杂。因为锁(以及其它更高级的线程同步机制)是由synchronized同步块的方式实现的,所以我们还不能完全摆脱synchronized关键字(译者注:这说的是Java 5之前的情况)。自Java 5...转载 2019-08-06 11:31:20 · 167 阅读 · 0 评论 -
饥饿和公平
原文地址ByJakob Jenkov 翻译Simon-SZ 校对:方腾飞如果一个线程因为CPU时间全部被其他线程抢走而得不到CPU运行时间,这种状态被称之为“饥饿”。而该线程被“饥饿致死”正是因为它得不到CPU运行时间的机会。解决饥饿的方案被称之为“公平性” – 即所有线程均能公平地获得运行机会。下面是本文讨论的主题:1.Java中导致饥饿的原因:高优先级线程吞噬所...转载 2019-08-05 15:30:52 · 156 阅读 · 0 评论 -
避免死锁
原文链接 作者:Jakob Jenkov译者:申章 校对:丁一在有些情况下死锁是可以避免的。本文将展示三种用于避免死锁的技术:加锁顺序 加锁时限 死锁检测加锁顺序当多个线程需要相同的一些锁,但是按照不同的顺序加锁,死锁就很容易发生。如果能确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生。看下面这个例子:Thread 1: loc...转载 2019-08-05 15:29:16 · 173 阅读 · 0 评论 -
Java中高级面试题(4)
这里选了几道高频面试题以及一些解答。不一定全部正确,有一些是没有固定答案的,如果发现有错误的欢迎纠正,如果有更好的回答,热烈欢迎留言探讨。BIO、NIO和AIO的区别Java BIO : 同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不必要的线程开销,当然可以通过线程池机制改善。Ja...转载 2019-07-31 23:13:07 · 179 阅读 · 0 评论 -
死锁
死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序请求同一组锁的时候。例如,如果线程1锁住了A,然后尝试对B进行加锁,同时线程2已经锁住了B,接着尝试对A进行加锁,这时死锁就发生了。线程1永远得不到B,线程2也永远得不到A,并且它们永远也不会知道发生了这样的事情。为了得到彼此的对象(A和B),它们将永远阻塞下去。这种情况就是一个死锁。...转载 2019-08-04 10:13:45 · 170 阅读 · 0 评论 -
线程安全及不可变性
当多个线程同时访问同一个资源,并且其中的一个或者多个线程对这个资源进行了写操作,才会产生竞态条件。多个线程同时读同一个资源不会产生竞态条件。我们可以通过创建不可变的共享对象来保证对象在线程间共享时不会被修改,从而实现线程安全。如下示例:public class ImmutableValue{ private int value = 0; public Immutable...转载 2019-07-31 11:03:13 · 153 阅读 · 0 评论 -
线程安全与共享资源
允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。当多个线程同时更新共享资源时会引发竞态条件。因此,了解Java线程执行时共享了什么资源很重要。局部变量局部变量存储在线程自己的栈中。也就是说,局部变量永远也不会被多个线程共享。所以,基础类型的局部变量是线程安全的。下面是基础类型的局部变量的一个例子:public void someMethod(){...转载 2019-07-31 10:34:59 · 204 阅读 · 0 评论 -
Java学习 —— 并发编程网
并发编程网:http://ifeve.com/原创 2019-07-26 00:04:00 · 209 阅读 · 0 评论 -
Java面试题-并发篇十六
161,Java内存模型是什么? Java内存模型规定和指引Java程序在不同的内存架构,CPU和操作系统间有确定性地行为。它在多行程的情况下尤为重要。Java内存模型对一个线程所做的变动能被其他线程可见提供了保证,它们之间是先行发生关系。这个关系定义了一些规则让程序员在并发编程时思路更清晰。比如,先行发生关系确保了: 线程内的代码能够按先后顺序执行,这被称为...转载 2019-07-25 23:22:19 · 129 阅读 · 0 评论 -
Java中高级面试题(1)
List和Set比较,各自的子类比较对比一:Arraylist与LinkedList的比较1、ArrayList是实现了基于动态数组的数据结构,因为地址连续,一旦数据存储好了,查询操作效率会比较高(在内存里是连着放的)。2、因为地址连续, ArrayList要移动数据,所以插入和删除操作效率比较低。 3、LinkedList基于链表的数据结构,地址是任意的,所以在开辟内存...转载 2019-07-30 23:14:50 · 137 阅读 · 0 评论 -
Java多线程系列--“JUC线程池”05之 线程池原理——线程池的四种拒绝策略
概要本章介绍线程池的拒绝策略。内容包括:拒绝策略介绍拒绝策略对比和示例转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html拒绝策略介绍线程池的拒绝策略,是指当任务添加到线程池中被拒绝,而采取的处理措施。当任务添加到线程池中之所以被拒绝,可能是由于:第一,线程池异常关闭。第二,任务数量超过线程池的最大限制。线...转载 2019-06-23 13:50:40 · 266 阅读 · 0 评论 -
Java多线程并发——并发知识库,4种线程创建方式,4种线程池,线程生命周期,终止线程4种方式
JAVA 并发知识库JAVA 线程实现/创建方式 1、继承 Thread 类Thread 类本质上是实现了 Runnable 接口的一个实例,代表一个线程的实例。启动线程的唯一方法就是通过 Thread 类的 start()实例方法。start()方法是一个 native 方法,它将启动一个新线程,并执行 run()方法。public class MyThread ...原创 2019-06-29 14:40:09 · 1079 阅读 · 0 评论 -
Java多线程1:进程与线程概述
进程和线程谈到多线程,就得先讲进程和线程的概念。进程进程可以理解为受操作系统管理的基本运行单元。360浏览器是一个进程、WPS也是一个进程,正在操作系统中运行的".exe"都可以理解为一个进程线程进程中独立运行的子任务就是一个线程。像QQ.exe运行的时候就有很多子任务在运行,比如聊天线程、好友视频线程、下载文件线程等等。为什么要使用多线程如果使用得当,线程可...转载 2019-01-27 12:17:51 · 164 阅读 · 0 评论 -
Java多线程2:Thread中的实例方法
Thread类中的方法调用方式:学习Thread类中的方法是学习多线程的第一步。在学习多线程之前特别提出一点,调用Thread中的方法的时候,在线程类中,有两种方式,一定要理解这两种方式的区别:1、this.XXX()这种调用方式表示的线程是线程实例本身2、Thread.currentThread.XXX()或Thread.XXX()上面两种写法是一样的意思。这种调用方式表示的...转载 2019-01-27 12:22:52 · 239 阅读 · 0 评论 -
Java多线程3:Thread中的静态方法
Thread类中的静态方法Thread类中的静态方法表示操作的线程是"正在执行静态方法所在的代码块的线程"。为什么Thread类中要有静态方法,这样就能对CPU当前正在运行的线程进行操作。下面来看一下Thread类中的静态方法:1、currentThread()currentThread()方法返回的是对当前正在执行线程对象的引用。看一个重要的例子,然后得出结论:public...转载 2019-01-27 17:28:12 · 312 阅读 · 0 评论 -
Java多线程4:synchronized锁机制
脏读一个常见的概念。在多线程中,难免会出现在多个线程中对同一个对象的实例变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实是被更改过的。多线程线程安全问题示例看一段代码:public class ThreadDomain13{ private int num = 0; public void ad...转载 2019-01-27 18:02:35 · 120 阅读 · 0 评论 -
Java多线程5:synchronized锁方法块
synchronized同步代码块用关键字synchronized声明方法在某些情况下是有弊端的,比如A线程调用同步方法执行一个较长时间的任务,那么B线程必须等待比较长的时间。这种情况下可以尝试使用synchronized同步语句块来解决问题。看一下例子:public class ThreadDomain18{ public void doLongTimeTask() th...转载 2019-01-31 23:17:59 · 154 阅读 · 0 评论 -
Java多线程6:synchronized锁定类方法、volatile关键字及其他
同步静态方法synchronized还可以应用在静态方法上,如果这么写,则代表的是对当前.java文件对应的Class类加锁。看一下例子,注意一下printC()并不是一个静态方法:public class ThreadDomain25{ public synchronized static void printA() { try {...转载 2019-01-31 23:23:30 · 106 阅读 · 0 评论 -
Java多线程7:死锁
前言死锁单独写一篇文章是因为这是一个很严重的、必须要引起重视的问题。这不是夸大死锁的风险,尽管锁被持有的时间通常很短,但是作为商业产品的应用程序每天可能要执行数十亿次获取锁->释放锁的操作,只要在这数十亿次操作中只要有一次发生了错误,就可能导致程序中发生死锁,并且即使通过压力测试也不可能找出所有潜在的死锁。死锁一个经典的多线程问题。当一个线程永远地持有一个锁,并且其他线...转载 2019-02-03 09:30:39 · 152 阅读 · 0 评论 -
Java多线程8:wait()和notify()/notifyAll()
轮询线程本身是操作系统中独立的个体,但是线程与线程之间不是独立的个体,因为它们彼此之间要相互通信和协作。想像一个场景,A线程做int型变量i的累加操作,B线程等待i到了10000就打印出i,怎么处理?一个办法就是,B线程while(i == 10000),这样两个线程之间就有了通信,B线程不断通过轮训来检测i == 10000这个条件。这样可以实现我们的需求,但是也带来了问题:CPU把...转载 2019-02-03 10:37:24 · 133 阅读 · 0 评论 -
Java并发之线程中断
Java并发之线程中断前面的几篇文章主要介绍了线程的一些最基本的概念,包括线程的间的冲突及其解决办法,以及线程间的协作机制。本篇主要来学习下Java中对线程中断机制的实现。在我们的程序中经常会有一些不达到目的不会退出的线程,例如:我们有一个下载程序线程,该线程在没有下载成功之前是不会退出的,若此时用户觉得下载速度慢,不想下载了,这时就需要用到我们的线程中断机制了,告诉线程,你不要继续执行了,准...转载 2018-11-26 10:48:26 · 129 阅读 · 0 评论 -
深入分析ThreadLocal
我们在使用一个类时,首先要知道它能做什么,然后再去深入分析它的工作原理。ThreadLocal如果从名字上来看像是“本地线程"的意思,其实ThreadLocal并不是一个线程,而是线程的局部变量。当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。在Java多线程面试题中...转载 2018-11-20 21:49:47 · 226 阅读 · 0 评论