多线程
文章平均质量分 78
Archie_java
求知若饥,虚心若愚(stay hungry,stay foolish)
好记性不如烂笔头
展开
-
如何优雅的自定义 ThreadPoolExecutor 线程池
java 中经常需要用到多线程来处理一些业务,非常不建议单纯使用继承Thread或者实现Runnable接口的方式来创建线程,那样势必有创建及销毁线程耗费资源、线程上下文切换问题。同时创建过多的线程也可能引发资源耗尽的风险,这个时候引入线程池比较合理,方便线程任务的管理。原创 2023-06-17 17:41:39 · 1079 阅读 · 0 评论 -
你真的知道什么是多线程吗?为什么要学习多线程?
文章目录1、多线程的含义2、原理3、优势4、线程与进程的区别5、线程与多线程的区别6、线程调度的分类7、同步与异步8、并发与并行9、为什么要使用线程池10、线程池的好处11、线程池的分类12、意义1、多线程的含义多线程(multithreading),是指从软件或者硬件上实现多个线程并发执行的技术。具有多线程能力的计算机因有硬件支持而能够在同一时间执行多于一个线程,进而提升整体处理性能。具有这种能力的系统包阔对称处理机、多核心处理器以及芯片级多处理或同时多线程处理器。在一个程序中,这些独立运行的程序片转载 2022-02-27 10:25:42 · 425 阅读 · 0 评论 -
线程池参数到底要怎么配?
文章目录1 线程池快速回顾2 现有设置参数的方法及不足3 如何设置核心线程数(corePoolSize)4 如何设置最大线程数(maxPoolSize)5 如何改变等待队列长度想必大家对Java里面线程池( 类)一定不陌生吧,无论是在日常工作还是面试题里都经常会有它的身影,特别是在当前CPU动辄就是好多核的背景下,了解并使用线程池已经成为一名合格后端开发的基本功了。相信大家也一定思考过一个问题,面对各种各样的场景,线程池的参数到底应该怎么设计呢?这一定是一个超级难以回答的问题,几天前的我也想不到一个标准原创 2022-02-27 10:20:29 · 894 阅读 · 0 评论 -
java 线程安全的原因_java的多线程:java安全问题产生的原因与JMM的关系
一、多线程产生安全问题1、Java内存模型共享内存模型指的就是Java内存模型(简称JMM),JMM决定一个线程对共享变量的写入时,能对另一个线程可见。从抽象的角度来看,JMM定义了线程和主内存之间的抽象关系:线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本。本地内存是JMM的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化。1.主内存:存放多线原创 2022-02-17 22:31:12 · 305 阅读 · 0 评论 -
Java中保证线程安全的三板斧
前言现在,如果要使用 Java 实现一段线程安全的代码,大致有 synchronized 、 java.util.concurrent 包等手段。虽然大家都会用,但却不一定真正清楚其在 JVM 层面上的实现原理,因此,笔者在查阅了一些资料后,希望把自己对此的一些见解分享给大家。三板斧之一:互斥同步互斥同步:使用互斥的手段来保证同步操作。互斥是方法,同步是目的。在 Java 的世界里,最基本的互斥同步手段就是使用 synchronized 关键字。synchronized 关键字synchr原创 2022-02-17 22:25:35 · 2759 阅读 · 1 评论 -
线程安全问题
定义首先大家需要思考一下何为线程安全性呢???《Java并发编程实战》书中给出定义:当多个线程访问某个类时,不管运行时环境采用何种调度方式或者这些线程将如何交替执行,并且在调用代码中不需要任何额外的同步,这个类都能表现出正确的行为,那么这个类就是线程安全的。对于线程安全性主要从以下几个方面出发:原子性、有序性、可见性。原子性: 提供互斥访问,同一时刻只能有一个线程对数据进行操作;例如:atomicXXX类,synchronized关键字的应用。有序性: 一个线程观察其他线程中的指令执行顺序,由原创 2022-02-17 22:16:27 · 204 阅读 · 0 评论 -
Java并发——线程安全
1、线程安全多个线程对同一个共享变量进行读写操作时可能产生不可预见的结果,这就是线程安全问题。故线程安全的核心点就是共享变量,只有在共享变量的情况下才会有线程安全问题。这里说的共享变量,是指多个线程都能访问的变量,一般包括成员变量和静态变量,方法内定义的局部变量不属于共享变量的范围。线程安全问题示例:import lombok.extern.slf4j.Slf4j;/** * @Author FengJian * @Date 2021/1/27 10:59 * @Version 1.0原创 2022-02-17 21:58:32 · 450 阅读 · 0 评论 -
Java多线程中static变量的使用
Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果?Java中 没处理好同步 导致两个线程同时为一个static变量赋值 会导致什么后果?仅仅是多耗资源还是会引发异常?不会耗资源 也不会引发异常而是程序出现逻辑错误,如本来该出现 3 的地方出现了 2 …,这比前两种情况更严重Java多线程中static变量的使用线程,是我们项目中绕不过的重点领域。提到线程,就常会听到线程安全的术语。那什么是线程安全呢?通俗点说,就是线程访问时不产生资源冲突。其实,这是一个有点难以原创 2022-02-17 21:53:53 · 6156 阅读 · 0 评论 -
java.lang.Thread类详解,yield方法,join方法,interrupt方法,interrupted方法,destroy方法
一、前言位于java.lang包下的Thread类是非常重要的线程类,它实现了Runnable接口,今天我们来学习一下Thread类,在学习Thread类之前,先介绍与线程相关知识:线程的几种状态、上下文切换,然后接着介绍Thread类中的方法的具体使用。二、线程的状态在正式学习Thread类中的具体方法之前,我们先来了解一下线程有哪些状态,这个将会有助于后面对Thread类中的方法的理解。线程从创建到最终的消亡,要经历若干个状态。一般来说,线程包括以下这几个状态:创建(new)、就绪(runnab原创 2021-08-01 13:46:07 · 1104 阅读 · 0 评论 -
关于java中线程yield()方法问题
关于java中线程yield()方法问题问题一:我知道yield是用来休眠当前线程,但我查看了资料,又说其不会释放锁,所以我就不解了,其明明会将cpu资源给其他线程,那它不释放锁,其他线程有怎么获取cpu资源呢?还是我理解有误?问题二:资料说是相同优先级的线程可以竞争获取资源?那么比它优先级高的有机会吗?yield() 方法和释放不释放锁没有关系,楼主对其作用理解有偏差。jdk 中的解释为:调用该方法的线程通知线程调度器当前线程可以让出CPU,线程调度器可以响应或者忽略此请求。要注意的是:线程调原创 2022-02-13 16:55:48 · 1292 阅读 · 0 评论 -
使用CAS代替synchronized
在开发当中需要经常用到synchronized保证代码线程安全,在竞争条件下会阻塞等待资源,如果允许竞争不到资源返回失败,就可以使用cas减少阻塞时间。先来看一个cas的单例模式。public class NonBlock { private static volatile NonBlock nonBlock; private static AtomicBoolean atomicBoolean = new AtomicBoolean(false); public static NonB原创 2022-02-13 11:50:17 · 342 阅读 · 0 评论 -
CAS和Synchronized知识
一. CAS何为CAS。CAS(Compare And Swap )是乐观锁的一种实现方式,是一种轻量级锁。JAVA1.5开始引入了CAS,JUC下很多工具类都是基于CAS。CAS的实现方式CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。当多个线程同时尝试使用CAS更新一个变量时,任何时候只有一个线程可以更新成功,若更新失败,线程会重新进入循环再次进行尝试。CAS在Java中的应用前面也说了JUC下面很多工具类原创 2022-02-13 11:41:49 · 1948 阅读 · 0 评论 -
多线程之CAS与synchronized的比较
业务场景:需要实现一个支持并发的计数功能1、计数功能的基本实现是:public class Increment{ private int count = 0; public void add(){ count++; }}2、以上实现在并发环境下是不安全的,故修改方案1是加锁synchronized:public class Increment{ private int count = 0; public synchronized void add()原创 2022-02-13 11:07:38 · 507 阅读 · 0 评论 -
Java并发面试宝典,并发相关面试再也难不倒你!
1、在java中守护线程和用户线程的区别?java中的线程分为两种:守护线程(Daemon)和用户线程(User)。任何线程都可以设置为守护线程和用户线程,通过方法Thread.setDaemon(bool on);true则把该线程设置为守护线程,反之则为用户线程。Thread.setDaemon()必须在Thread.start()之前调用,否则运行时会抛出异常。两者的区别:唯一的区别是判断虚拟机(JVM)何时离开,Daemon是为其他线程提供服务,如果全部的User Thread已经结束,Da原创 2021-10-16 22:06:48 · 215 阅读 · 0 评论 -
Java线程池七个参数详解
java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。一、corePoolSize 线程池核心线程大小线程池中会维护一个最小的线程数量,即使这些线程处理空闲状态,他们也不会被销毁,除非设置了allowCoreThreadT原创 2021-10-16 21:51:34 · 1190 阅读 · 1 评论 -
多线程买票案例
测试类package thead;public class testThread { public static void main(String [] arg){ Tickets ticket = new Tickets(); Thread t1 = new Thread(ticket,"窗口一:"); Thread t2 = new Thread(ticket,"窗口二:"); Thre原创 2021-10-10 21:55:07 · 301 阅读 · 0 评论 -
Java创建并执行线程的四种方法
Java创建并执行线程的四种方法java里面创建线程有四种方式:无返回:实现Runnable接口,重写run();继承Thread类,重写run();有返回:实现Callable接口,重写call(),利用FutureTask包装Callable,并作为task传入Thread构造函数;利用线程池;下面来看看具体的创建方式:5. 继承Thread类,重写run();创建:创建线程只需要继承Thread类,然后在run方法里写下线程要实现的任务即可;调用:通过调用start方法来启原创 2021-10-01 18:32:48 · 2841 阅读 · 0 评论