线程
文章平均质量分 50
这瓜保熟么
平常心
展开
-
JAVA多线程之wait/notify
https://www.cnblogs.com/hapjin/p/5492645.html转载 2021-08-08 00:57:51 · 110 阅读 · 0 评论 -
Java多线程wait()用while代码块的理解
多线程wait()判断条件这个地方的逻辑琢磨了挺久的,本意就是拿到锁之后如果条件不满足就等待,感觉用if和while似乎没啥区别首先是生产者,单独一个线程,和消费者共用一个锁和一个队列,都通过构造方法传入1.线程里直接死循环持续生产消息,消息体最好不一样,可以弄个随机数,我这里用了微妙时间戳,调用add()方法2.需要添加一个条件,如果队列已经满了,就不能继续添加了,调用wait()方法等待被其它线程消费了之后唤醒3.生产完消息后,调用notifyAll()方法,唤醒等待的所有线程,直到sy转载 2021-08-08 00:30:11 · 358 阅读 · 0 评论 -
为什么wait(),notify(),notifyAll()必须在同步方法/代码块中调用?
在JAVA中,所有的对象都能够被作为‘监视器monitor’——指的是一个拥有一个独占锁,一个入口队列,和一个等待队列的实体entity。所有对象的非同步方法都能在任意时刻被任意线程调用,此时不需要考虑加锁的问题。而对于对象的同步方法来说, 在任意时刻有且仅有一个拥有该对象独占锁的线程能够调用它们。 例如,一个同步方法是独占的。如果在线程调用某一个对象的同步方法的时候,对象的独占锁被其他线程占有,那么当前线程将处于阻塞状态。并添加到对象的入口队列中。只有在调用线程拥有的某个对象的独占锁的时候,才能够调用转载 2021-08-07 22:40:31 · 913 阅读 · 0 评论 -
线程状态转换图
https://www.cnblogs.com/waterystone/p/4920007.html转载 2021-08-07 22:19:20 · 100 阅读 · 0 评论 -
tomcat最大线程数设置的依据
重要参数maxThread:tomcat的maxThread指的是处理业务的最大线程数,位于Connector组件的层次,在springboot中由server.tomcat.max-threads参数决定,默认是200 acceptCount:当前线程数达到maxThread的时候,等待队列的最大长度,默认为100tomcat接收请求创建线程的过程如果当前线程数还没有达到maxThread,则创建一个线程去执行任务 如果已经达到了maxThread,但是等待列队中的任务还没有达到accpet转载 2021-02-02 16:55:34 · 1250 阅读 · 0 评论 -
IO多路复用技术详解
IO多路复用:I/O是指网络I/O,多路指多个TCP连接(即socket或者channel),复用指复用一个或几个线程。意思说一个或一组线程处理多个TCP连接。最大优势是减少系统开销小,不必创建过多的进程/线程,也不必维护这些进程/线程。IO多路复用使用两个系统调用(select/poll/epoll和recvfrom),blocking IO只调用了recvfrom;select/poll/epoll 核心是可以同时处理多个connection,而不是更快,所以连接数不高的话,性能不一定比多线程+阻转载 2020-12-24 20:22:05 · 170 阅读 · 2 评论 -
关于CPU使用率飙升,我们需要了解什么?
https://blog.csdn.net/u012846795/article/details/106654717?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2~all~sobaiduend~default-1-106654717.nonecase&utm_term=cpu%E9%AB%98%20gc%20%E4%B8%8D%E5%81%9Cyoung&spm=1000.2123.3001.4430转载 2020-10-08 00:10:52 · 111 阅读 · 0 评论 -
多线程常用的5种-线程模型
在处理业务的时候,有时候需要根据情况使用不同的线程处理模型来处理业务逻辑,这里演示一下常见的线程模型使用技巧。1、Future模型 前面的章节中提到过Future模型,该模型通常在使用的时候需要结合Callable接口配合使用。Future:未来的、将来的,再结合Callable大概可以明白其功能。 Future是把结果放在将来获取,当前主线程并不急于获取处理结果。允许子线程先进行处理一段时间,处理结束之后就把结果保存下来,当主线程需要使用的时候再向子线程索取。 Callable是类似转载 2020-08-27 00:10:05 · 2974 阅读 · 0 评论 -
浅析java中的TLAB
new对象与指针碰撞new对象怎么就出问题了呢?java中我们要创建一个对象,用关键字new就可以了。但是,在我们日常中,有很多生命周期很短的对象。比如:public void dome(){ User user=new user(); user.sayhi();}这种对象的作用域都不会逃逸出方法外,也就是说该对象的生命周期会随着方法的调用开始而开始,方法的调用结束而结束。假设JVM所有的对象都放在堆内存中(为什么用假设,因为JVM并不是这样)一旦方法结束,没有了指向该对转载 2020-08-22 22:00:08 · 620 阅读 · 0 评论 -
为什么ConcurrentHashMap的get操作不需要加锁?
我们知道,ConcurrentHashmap(1.8)这个并发集合框架是线程安全的,当你看到源码的get操作时,会发现get操作全程是没有加任何锁的这也是这篇博文讨论的问题——为什么它不需要加锁呢?1、ConcurrentHashMap的简介有基础的同学知道在jdk1.7中是采用Segment + HashEntry + ReentrantLock的方式进行实现的1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现。转载 2020-08-20 21:12:25 · 2054 阅读 · 1 评论 -
ConcurrentHashMap线程不安全的场景
明明用了ConcurrentHashMap,可是始终线程不安全,下面我们来看代码:public class Test40 { public static void main(String[] args) throws InterruptedException { for (int i = 0; i < 10; i++) { System.out.println(test()); } } private st.转载 2020-08-20 20:56:11 · 5737 阅读 · 3 评论 -
java向多线程中传递参数的三种方法详细介绍
在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果。但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别(java中如何给多线程中子线程传递参数)。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据。本文就以上原因介绍了几种用于向线程传递数据的方法,在下一篇文章中将介绍从线程中返回数据的方法。欲先取之,必先予之。一般在使用线程时都需要有一些初始化数据,然后转载 2020-06-04 10:30:41 · 3701 阅读 · 0 评论 -
进程间通信的几种方式
下面我们介绍进程间通信机制。有了信号量有了管程之后,为什么进程之间还需要新的通信机制?这主要原因是,信号量和管程只能传递很简单的信息,不能传递大量的信息比如说,我要把一个大的数组传送给另外一个进程,那么信号量和管程在这一方面是做不到的。另外呢管程不适合于用于多处理器的情况因此呢,我们需要在传递大量信息的时候呢,引入新的通信机制,那么这个通信机制呢我们称之为,进程间通信机制。...转载 2020-05-03 22:06:23 · 447 阅读 · 0 评论 -
【操作系统】进程间的几种通信方式的比较和线程间的几种通信方式
几种进程间的通信方式(1) 管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。(2)有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。(3)信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进...转载 2020-05-03 18:00:58 · 1146 阅读 · 0 评论 -
JAVA多线程——线程安全之原子性,有序性和可见性
对于Java并发编程,一般来说有以下的关注点:1.线程安全性,正确性。2.线程的活跃性(死锁,活锁)3.性能其中线程的安全性问题是首要解决的问题,线程不安全,运行出来的结果和预期不一致,那就连基本要求都没达到了。保证线程的安全性问题,本质上就是保证线程同步,实际上就是线程之间的通信问题。我们知道,在操作系统中线程通信有以下几种方式:1.信号量2.信号3.管道...转载 2020-05-03 17:19:05 · 243 阅读 · 0 评论 -
关于线程interrupt方法
interrupt是Thread类中的方法 如果线程单纯的调用这个方法,则只是改变了线程的中断状态,线程还是会往下执行package com.xd.mythread; //MyThread 类自己可以定义一下 比较简单public class MyThreadTest { public static void main(String[] args) { MyThread ...转载 2020-05-02 16:00:03 · 326 阅读 · 0 评论 -
为什么HashMap线程不安全
1:Hashmap resize机制HashMap的扩容机制就是重新申请一个容量是当前的2倍的桶数组,然后将原先的记录逐个重新映射到新的桶里面,然后将原先的桶逐个置为null使得引用失效。后面会讲到,HashMap之所以线程不安全,就是resize这里出的问题。2:为什么HashMap线程不安全上面说到,HashMap会进行resize操作,在resize操作的时候会造成线程不安全。下...转载 2020-04-28 15:03:23 · 154 阅读 · 0 评论 -
ThreadLocal内存泄漏问题
1:1:内存泄漏下图中,实线代表强引用,虚线代表的是弱引用,如果threadLocal外部强引用被置为null(threadLocalInstance=null)的话,threadLocal实例就没有一条引用链路可达,很显然在gc(垃圾回收)的时候势必会被回收,因此entry就存在key为null的情况,无法通过一个Key为null去访问到该entry的value。同时,就存在了这样一条引...转载 2020-04-26 14:53:28 · 925 阅读 · 0 评论 -
Executors.newSingleThreadScheduledExecutor();线程池中放入多个线程后执行顺序问题
import java.util.Date;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.ScheduledFuture;import java.util.concurrent.TimeUnit;...转载 2020-01-02 12:37:23 · 746 阅读 · 0 评论 -
Executors.newSingleThreadScheduledExecutor()实现定时任务 并解决其发生异常时卡死状态
import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.TimeUnit; public class Task { /**定时任务 * @param args */...转载 2020-01-02 12:34:39 · 1809 阅读 · 0 评论 -
捕获Java线程池执行任务抛出的异常 futrue获取结果异常情况
1:submit(Callable<T> task)submit方便Exception处理:There is a difference when looking at exception handling. If your tasks throws an exception and if it was submitted with execute this exceptio...原创 2019-12-06 13:38:43 · 3512 阅读 · 0 评论 -
子类用父类成员变量线程安全问题
Java父类与子类的 内存引用讲解从对象的内存角度来理解试试.假设现在有一个父类Father,它里面的变量需要占用1M内存.有一个它的子类Son,它里面的变量需要占用0.5M内存.现在通过代码来看看内存的分配情况:Fatherf=newFather();//系统将分配1M内存.Sons=newSon();//系统将分配1.5M内存!因为子类中有一个隐藏的引用supe...原创 2019-12-03 13:54:19 · 2168 阅读 · 0 评论 -
Java中守护线程的总结
在Java中有两类线程:User Thread(用户线程)、Daemon Thread(守护线程)用个比较通俗的比如,任何一个守护线程都是整个JVM中所有非守护线程的保姆:只要当前JVM实例中尚存在任何一个非守护线程没有结束,守护线程就全部工作;只有当最后一个非守护线程结束时,守护线程随着JVM一同结束工作。Daemon的作用是为其他线程的运行提供便利服务,守护线程最典型的应用就是 ...转载 2019-10-14 20:22:11 · 170 阅读 · 0 评论 -
Java线程之异步回调(Callback)
●介绍 有时候执行一个任务需要很长时间,单线程下线程会处于阻塞状态。这个时候我们会考虑一种非阻塞的处理模式。非阻塞任务在任何编程语言里都必不可少,Java也不例外。多线程就是一个很好的解决办法。 但是多线程是异步处理,异步就意味着不知道处理结果,如果我们需要知道处理结果的时候应该怎么办呢? 笔者介绍下面两种方法 ●Callback 回调一般是异步处理的一种技术。一个回调是被传...翻译 2018-09-26 19:33:24 · 30038 阅读 · 2 评论 -
Java线程池工作原理
Java中的线程池是运用场景最多的并发框架,几乎所有需要异步或并发执行任务的程序都可以使用线程池,所以我们就要认识并弄懂线程池,以便于更好的为我们业务场景服务。一、线程池的好处在开发过程中,合理地使用线程池大致有3个好处第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:...转载 2019-02-28 21:06:34 · 2178 阅读 · 0 评论 -
volatile能保证有序性
在前面提到volatile关键字能禁止指令重排序,所以volatile能在一定程度上保证有序性。 volatile关键字禁止指令重排序有两层意思: 1)当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行; 2)在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,...转载 2019-02-28 16:28:20 · 6435 阅读 · 5 评论 -
深入剖析volatile关键字
1.volatile关键字的两层语义 一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。 2)禁止进行指令重排序。 先看一段代码,假如线程1先执行,线程2后执行://线程1boolean stop = f...转载 2019-02-28 16:07:33 · 110 阅读 · 0 评论 -
Java内存模型(原子性、可见性、有序性)
Java内存模型规定所有的变量都是存在主存当中(类似于前面说的物理内存),每个线程都有自己的工作内存(类似于前面的高速缓存)。线程对变量的所有操作都必须在工作内存中进行,而不能直接对主存进行操作。并且每个线程不能访问其他线程的工作内存。 举个简单的例子:在java中,执行下面这个语句:i = 10;执行线程必须先在自己的工作线程中对变量i所在的缓存行进行赋值操作,然后再写入主存当...转载 2019-02-28 15:12:17 · 840 阅读 · 1 评论 -
并发编程中的三个概念(原子性,可见性,有序性)
在并发编程中,我们通常会遇到以下三个问题:原子性问题,可见性问题,有序性问题。我们先看具体看一下这三个概念:1.原子性 原子性:即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。 一个很经典的例子就是银行账户转账问题: 比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上1000元。 试想一下...转载 2019-02-28 14:58:49 · 365 阅读 · 0 评论 -
内存模型的相关概念Intel 的MESI协议保证线程安全
大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存...转载 2019-02-28 14:24:40 · 415 阅读 · 1 评论 -
深入理解ConcurrentHashMap原理分析以及线程安全性问题
ConcurrentHashMap与HashTable区别?HashTableput()源代码从代码可以看出来在所有put 的操作的时候 都需要用 synchronized 关键字进行同步。并且key 不能为空。 这样相当于每次进行put 的时候都会进行同步 当10个线程同步进行操作的时候,就会发现当第一个线程进去 其他线程必须等待第一个线程执行完成,才可以进行下去。性能特别差。...转载 2019-02-19 00:37:08 · 144 阅读 · 0 评论 -
ConcurrentHashMap原理浅析
如果实在懒得看也没有关系,我们来简单回顾一下HashMap的结构:简单来说,HashMap是一个Entry对象的数组。数组中的每一个Entry元素,又是一个链表的头节点。Hashmap不是线程安全的。在高并发环境下做插入操作,有可能出现下面的环形链表: Segment在高并发的情况下,一般会使用currentHashMap,ConcurrentHashMap对比HashM...转载 2019-02-19 00:28:32 · 233 阅读 · 0 评论 -
volatile不会读到过期的值的原因
是因为根据Java内存模型的happen before原则,对volatile字段的写操作先于读操作,即使两个线程同时修改和获取 volatile变量,get操作也能拿到最新的值, 这是用volatile替换锁的经典应用场景. 一、不得不提的volatile一、不得不提的volatilevolatile是个很老的关键字,几乎伴随着JDK的诞生而诞生,我们都知道这个关键字,但又不太...原创 2019-02-19 00:10:30 · 501 阅读 · 2 评论 -
理解java线程的中断(interrupt)
一个线程在未正常结束之前, 被强制终止是很危险的事情. 因为它可能带来完全预料不到的严重后果比如会带着自己所持有的锁而永远的休眠,迟迟不归还锁等。 所以你看到Thread.suspend, Thread.stop等方法都被Deprecated了那么不能直接把一个线程搞挂掉, 但有时候又有必要让一个线程死掉, 或者让它结束某种等待的状态 该怎么办呢?一个比较优雅而安全的做法是:使用等待/通...原创 2019-03-01 00:52:29 · 562 阅读 · 1 评论 -
Java并发-AQS及各种Lock锁的原理
什么是AQSAQS是AbustactQueuedSynchronizer的简称,它是一个Java提高的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操作来管理这个同步状态。AQS的主要作用是为Java中的并发同步组件提供统一的底层支持,例如ReentrantLock,CountdowLatch就是基于AQS实现的,用法是通过继承AQS实现其模版方法,然后将子类作为同步...转载 2019-03-01 00:54:00 · 172 阅读 · 0 评论 -
CountDownLatch:不调用await()方法 来控制线程并发
import java.util.concurrent.CountDownLatch;import java.util.concurrent.ExecutorService;import java.util.concurrent.Executors;/** * CountDownLatch:多线程控制工具类,不调用await()方法 来控制线程并发 */public class C...原创 2019-05-30 10:21:43 · 2501 阅读 · 4 评论 -
为什么HashMap线程不安全
一、Map概述我们都知道HashMap是线程不安全的,但是HashMap的使用频率在所有map中确实属于比较高的。因为它可以满足我们大多数的场景了。 Map类继承图上面展示了java中Map的继承图,Map是一个接口,我们常用的实现类有HashMap、LinkedHashMap、TreeMap,HashTable。HashMap根据key的hashCode值来保存value,需...转载 2019-02-26 20:25:01 · 1842 阅读 · 0 评论 -
LinkedBlockingQueue
1、简介这一篇我们来学习一下ArrayBlockingQueue的“亲戚” LinkedBlockingQueue。在集合框架里,想必大家都用过ArrayList和LinkedList,也经常在面试中问到他们之间的区别。ArrayList和ArrayBlockingQueue一样,内部基于数组来存放元素,而LinkedBlockingQueue则和LinkedList一样,内部基于链表来存放元...转载 2019-02-26 14:45:41 · 98 阅读 · 0 评论 -
Java多线程的上下文切换
对于上下文切换不同的操作系统模式也不尽相同,这里我们只讨论Unix系统,在我之前的文章中提到过windows的抢占式,这里就不在赘述。 无论是单核还是多核CPU都是支持多线程代码的,CPU通过给每个线程分配CPU时间片来实这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms) CPU通过时间...翻译 2019-02-26 01:08:41 · 789 阅读 · 0 评论 -
JAVA自带的4种线程池
为什么要用线程池:1.减少了创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。2.可以根据系统的承受能力,调整线程池中工作线线程的数目,防止因为消耗过多的内存,而把服务器累趴下(每个线程需要大约1MB内存,线程开的越多,消耗的内存也就越大,最后死机)。Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的...转载 2019-02-25 23:28:43 · 3602 阅读 · 1 评论