当我们用关键字new创建一个Thread对象时,此时它并不处于执行状态,因为没有调用start方法启动该线程,那么线程的状态为NEW状态,NEW状态通过start方法进入RUNNABLE状态. 线程一启动并非立即得到执行.线程的运行与否和进程一样都要听命于CPU的调度,那么我们可把这个中间件称为可执行状态(RUNNABLE),也就是说它具备执行的资格,但是并没有真正执行起来而是在等待CPU的调度.…
Queue(队列)主要是为了高并发准备的容器Deque:双端队列,可以反方向装或者取 最开始jdk1.0只有Vector和hashtable 默认所有方法都实现了synchronized锁,线程安全但性能比较差,因此后续SUN意识到这个问题之后加了完全没加锁的hashmap,但是由于Hashmap完全没锁,SUN又想到能不能让Hashmap在有锁的时候用呢,此时添加了Collection,里面有一个Collection.synchronizedMap(new HashMap()),将Hashma…
读马士兵java高并发编程,引用他的代码,做个记录. 一.分析下面程序输出: /** * 分析一下这个程序的输出 * @author mashibing */ package yxxy.c_005; public class T implements Runnable { private int count = 10; public synchronized void run() { count--; System.out.println(Thread.currentThread().getNa…
高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求,而且也能怎么你在整个项目中的一个处理逻辑的能力体现.那么,你真的知道什么是高并发吗?这不是一个很简单的话题.高并发,往往会牵扯到很多的问题,如何才能快速响应,如何处理各个线程之间的交互,如何完成逻辑之间的高负载运转,甚至,一个系统,如果没有做好前期高并发的合理配置,整个产品会遇到瓶颈,以及不可预期的…
关于Java高并发编程你需要知道的"升段攻略" 基础 Thread对象调用start()方法包含的步骤 通过jvm告诉操作系统创建Thread 操作系统开辟内存并使用Windows SDK中的createThread()函数创建Thread线程对象 操作系统对Thread对象进行调度,以确定执行时机 Thread在操作系统中被成功执行 执行start的顺序不代表执行run的顺序 执行方法run和start有区别 xxx.run():立即执行run()方法,不启动新的线程 xxx.sta…
引言 上一篇文章我们介绍了AQS的信号量Semaphore<Java高并发编程基础三大利器之Semaphore>,接下来应该轮到CountDownLatch了. 什么是CountDownLatch CountDownLatch是通过一个计数器来实现的,计数器的初始值是线程的数量.每当一个线程执行完毕后,计数器的值就减1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上(调用await方法的线程)等待的线程就可以恢复工作了. 应用场景 CountDownLatch可以用来干什么呢?有什么…
本文原创更多内容可以参考: Java 全栈知识体系.如需转载请说明原处. 知识体系系统性梳理 Java 并发之基础 A. Java进阶 - Java 并发之基础:首先全局的了解并发的知识体系,同时了解并发理论基础和线程基础,并发关键字等,这些是你理解Java并发框架的基础.@pdai Java 并发 - 知识体系 Java 并发 - 理论基础 多线程的出现是要解决什么问题的? 线程不安全是指什么?举例说明 并发出现线程不安全的本质什么?可见性,原子性和有序性. Java是怎么解决并发问题的?3个…
java高并发主要有三块知识点: synchronizer:同步器,在多个线程之间互相之间怎么进行通讯,同步等: 同步容器:jdk提供了同步性的容器,比如concurrentMap,concurrentList,BlockQueen等: ThreadPool:线程池,executor,java在前两个的基础之上提供的线程池,很多实际中的问题可以着手解决了.   一.ReentrantLock jdk里面提供了一个新的锁,是手工锁,它是用来替代synchronized的,叫ReentrantLoc…
摘自马士兵java并发编程 一.认识Executor.ExecutorService.Callable.Executors /** * 认识Executor */ package yxxy.c_026; import java.util.concurrent.Executor; public class T01_MyExecutor implements Executor { public static void main(String[] args) { new T01_MyExecutor(…
摘抄自马士兵java并发视频课程: 一.需求背景: 有N张火车票,每张票都有一个编号,同时有10个窗口对外售票, 请写一个模拟程序. 分析下面的程序可能会产生哪些问题?重复销售?超量销售? /** * 有N张火车票,每张票都有一个编号 * 同时有10个窗口对外售票 * 请写一个模拟程序 * * 分析下面的程序可能会产生哪些问题? * 重复销售?超量销售? * * @author 马士兵 */ package yxxy.c_024; import java.util.ArrayList; impo…
马士兵java并发编程的代码,照抄过来,做个记录. 一.分析下面面试题 /** * 曾经的面试题:(淘宝?) * 实现一个容器,提供两个方法,add,size * 写两个线程,线程1添加10个元素到容器中,线程2实现监控元素的个数,当个数到5个时,线程2给出提示并结束 * * 分析下面这个程序,能完成这个功能吗? * @author mashibing */ package yxxy.c_019; import java.util.ArrayList; import java.util.List…
一.什么是高并发 高并发(High Concurrency)是互联网分布式系统架构设计中必须考虑的因素之一,它通常是指,通过设计保证系统能够同时并行处理很多请求. 高并发相关常用的一些指标有响应时间(Response Time),吞吐量(Throughput),每秒查询率QPS(Query Per Second),并发用户数等. 响应时间:系统对请求做出响应的时间.例如系统处理一个HTTP请求需要200ms,这个200ms就是系统的响应时间. 吞吐量:单位时间内处理的请求数量. QPS:每秒响应…
在上一篇程序框架中,解决了子进程退出,父进程继续存在的功能,但是多条客户端连接如果同一时间并行退出,导致服务器端多个子进程同一时间全部退出,而SIGCHLD是不可靠信号,同时来多条信号可能无法处理,导致出现僵尸进程,如果使用while循环wait又会阻塞父进程,这里采取waitpid()函数来解决这个问题. //辅助类实现 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <un…
Java是最早开始有并发的语言之一,再过去传统多任务的模式下,人们发现很难解决一些更为复杂的问题,这个时候我们就有了并发. 引用 多线程比多任务更加有挑战.多线程是在同一个程序内部并行执行,因此会对相同的内存空间进行并发读写操作.这可能是在单线程程序中从来不会遇到的问题.其中的一些错误也未必会在单CPU机器上出现,因为两个线程从来不会得到真正的并行执行.然而,更现代的计算机伴随着多核CPU的出现,也就意味着不同的线程能被不同的CPU核得到真正意义的并行执行. 那么,要开始Java并发之路,就要开…
从 acquire 方法开始 -- 获取 为什么 AQS 需要一个虚拟 head 节点 reelase 方法如何释放锁 总结 前言 AQS 是 JUC 中的核心,其中封装了资源的获取和释放,在我们之前的 并发编程之 AQS 源码剖析 文章中,我们已经从 ReentranLock 那里分析了锁的获取和释放.但我有必要再次解释 AQS 的核心 CLH 锁. 这里引用一下别人对于 CLH 的解释: CLH CLH(Craig, Landin, and Hagersten locks): 是一个自旋锁,…
引言 曾经有一道比较比较经典的面试题"你能够说说java的并发包下面有哪些常见的类?"大多数人应该都可以说出 CountDownLatch.CyclicBarrier.Sempahore多线程并发三大利器.这三大利器都是通过AbstractQueuedSynchronizer抽象类(下面简写AQS)来实现的,所以学习三大利器之前我们有必要先来学习下AQS. AQS是一种提供了原子式管理同步状态.阻塞和唤醒线程功能以及队列模型的简单框架 AQS结构 说到同步我们如何来保证同步?大家第一印…
https://www.cnblogs.com/liqiu/p/3152206.html 1.  worker_processes 8; nginx 进程数,建议按照cpu 数目来指定,一般为它的倍数 (如,2个四核的cpu计为8). 查看有几个物理CPU cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc -l 查看cpu核数(物理核) cat /proc/cpuinfo | grep "core id&quo…
一.Executor执行器 1.Executor接口,java线程池框架中的顶层接口,提供一个execute方法来执行任务 import java.util.concurrent.Executor; public class T01_MyExecutor implements Executor { public static void main(String[] args) { new T01_MyExecutor().execute(()->System.out.println("hel…
在上一次https://www.cnblogs.com/webor2006/p/11792954.html对于Lock的具体实现类ReentrantLock用了一个示例对它进行了一个简单的了解,而它其实里面有很多东东,不过得循序渐进一步步来,目前还不适合来从底层分析它,另外在上次对于Lock和syncronized对于同步的区别做了一个文字的总结,这里回顾一下,相当之重要: 而对于Lock这个接口其实提供的方法是比较少的,纵览一下: 其中大部分都是跟锁相关的方法,除了标红的这个是跟一个新的Con…
java线程具体解释及高并发编程庖丁解牛 线程概述: 祖宗: 说起java高并发编程,就不得不提起一位老先生Doug Lea,这位老先生可不得了.看看百度百科对他的评价,一点也不为过: 假设IT的历史,是以人为主体串接起来的话,那么肯定少不了Doug Lea. 这个鼻梁挂着眼镜.留着德王威廉二世的胡子,脸上永远挂着谦逊腼腆笑容.服务于纽约州立大学Oswego分校计算机科学系的老大爷. 说他是这个世界上对Java影响力最大的个人.一点也不为过. 由于两次Java历史上的大变革,他都间接或直接的扮演…
在java高并发编程,有几个很重要的内容: 1.CAS算法 2.CPU重排序 3.缓存行伪共享 我们先来说说高并发世界中的主要关键问题是什么? 是数据共享. 因为多线程之间要共享数据,就会遇到各种问题.如下图: 如果两个线程同时写入,那怎么保证数据的一致性?是线程1先写,还是线程2先写,这是个问题.那要如何解决这个问题? 答案是:加锁. 比如,线程1先访问共享数据区,那么它就先把这块数据区锁起来.后面如果其他线程要访问这个共享区,首先要从线程1这里获取锁,才能进一步访问这个共享区.这里很好理解,…
这是java高并发系列第19篇文章. 本文主要内容 介绍Executor框架相关内容 介绍Executor 介绍ExecutorService 介绍线程池ThreadPoolExecutor及案例 介绍定时器ScheduledExecutorService及案例 介绍Excecutors类的使用 介绍Future接口 介绍Callable接口 介绍FutureTask的使用 获取异步任务的执行结果的几种方法 Executors框架介绍 Executors框架是Doug Lea的神作,通过这个框架…
这是java高并发系列第20篇文章. 本文内容 ExecutorCompletionService出现的背景 介绍CompletionService接口及常用的方法 介绍ExecutorCompletionService类及其原理 示例:执行一批任务,然后消费执行结果 示例[2种方式]:异步执行一批任务,有一个完成立即返回,其他取消 需要解决的问题 还是举个例子说明更好理解一些. 买新房了,然后在网上下单买冰箱.洗衣机,电器商家不同,所以送货耗时不一样,然后等他们送货,快递只愿送到楼下,然后我们…