醋酸菌HaC
码龄10年
求更新 关注
提问 私信
  • 博客:675,612
    社区:370
    675,982
    总访问量
  • 179
    原创
  • 1,777
    粉丝
  • 101
    关注
IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:广东省
加入CSDN时间: 2015-04-10
博客简介:

HaC 的博客

博客描述:
分享Java实战项目公众号:HelloCoder
查看详细资料
个人成就
  • 获得426次点赞
  • 内容获得149次评论
  • 获得1,639次收藏
  • 代码片获得878次分享
  • 博客总排名420,761名
创作历程
  • 5篇
    2022年
  • 32篇
    2021年
  • 60篇
    2020年
  • 34篇
    2019年
  • 23篇
    2018年
  • 34篇
    2017年
成就勋章
TA的专栏
  • 从0到1学习Java多线程
    18篇
  • Dubbo教程
    10篇
  • 服务器搭建
    13篇
  • 数据结构与算法
    1篇
  • GitHub项目
    1篇
  • Java面试题
    4篇
  • JVM
    2篇
  • 运维
    1篇
  • MySQL原理与实战
    25篇
  • 原创自录
    40篇
  • 操作系统
    1篇
  • 计算机网络
    1篇
  • Java
    33篇
  • 前端
    10篇
  • 工具类
    14篇
  • mysql
    10篇
  • Git
    5篇
  • Linux
    2篇
  • springboot
    5篇
  • ERROR报错合集
    5篇
  • 读书笔记
    1篇
  • Redis
    6篇

TA关注的专栏 4

TA关注的收藏夹 0

TA关注的社区 5

TA参与的活动 0

兴趣领域 设置
  • 大数据
    mysqlredis
  • 后端
    spring
  • 服务器
    linux
创作活动更多

新星杯·14天创作挑战营·第13期

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你们参加为期14天的创作挑战赛!注: 1、参赛者可以进入活动群进行交流、互相鼓励与支持(开卷),虚竹哥会分享创作心得和涨粉心得,答疑及活动群请见:https://bbs.csdn.net/topics/619781944 【进活动群,得奖概率会更大,因为有辅导】 2、文章质量分查询:https://www.csdn.net/qc

88人参与 去参加
  • 最近
  • 文章
  • 专栏
  • 代码仓
  • 资源
  • 收藏
  • 关注/订阅/互动
更多
  • 最近

  • 文章

  • 专栏

  • 代码仓

  • 资源

  • 收藏

  • 关注/订阅/互动

  • 社区

  • 帖子

  • 问答

  • 课程

  • 视频

搜索 取消

我的计算机入门启蒙书——《浪潮之巅》感悟

吴军的《浪潮之巅》
原创
博文更新于 2023.12.13 ·
3401 阅读 ·
2 点赞 ·
2 评论 ·
8 收藏

TLDR,一个简易版的命令查询手册

Linux系统拥有丰富的命令,一切基于命令操作。但是要记住所有的命令,任何人可能都无法完成,其次,Linux的命令都带有十分多的参数。比如我平时百度得最多的是 tar 命令,虽然我知道它是解压缩用的,但你直接用的时候就蒙圈了。缺少参数的后果:[root@VM-8-8-centos software]# tar zookeeper-3.4.11.tar.gztar: Old option `g' requires an 
原创
博文更新于 2022.05.20 ·
4377 阅读 ·
4 点赞 ·
1 评论 ·
18 收藏

(十七)AtomicInteger原子类的介绍和使用

在第十四章提到 AtomicInteger 可以保证原子性。但是我并没有展开讲它的详细用法,因为内容多,所以这一章节就来学习一下原子操作类——AtomicIntegerAtomicInteger是对int类型的一个封装,提供原子性的访问和更新操作,其原子性操作的实现是基于CAS(compare-and -swap)技术。《深入理解Java虚拟机第二版.周志明》说到这个CAS:CAS在本专栏 第 十六章ReentrantLock 介绍过,也可以回顾一下。1、AtomicInteger 有什么用?
原创
博文更新于 2022.04.07 ·
729 阅读 ·
1 点赞 ·
1 评论 ·
2 收藏

(十六)ReentrantLock可重入锁使用和介绍

1、ReentrantLock介绍jdk中独占锁的实现除了使用关键字synchronized外,还可以使用ReentrantLock。虽然在性能上ReentrantLock和synchronized没有什么区别,但ReentrantLock相比synchronized而言功能更加丰富,使用起来更为灵活,也更适合复杂的并发场景。两者的相同点:1、ReentrantLock和synchronized都是独占锁,只允许线程互斥的访问临界区。但是实现上两者不同:synchronized加锁解锁的过程是隐
原创
博文更新于 2022.04.07 ·
988 阅读 ·
2 点赞 ·
5 评论 ·
6 收藏

(十五)ThreadLocal的用法,如何解决内存泄漏

什么是ThreadLocal变量ThreadLocal称为线程本地变量,其为变量在每个线程中都创建了一个副本,每个线程都访问和修改本线程中变量的副本,但每个线程之间的变量是不能相互访问的,ThreadLocal不是一个Thread。ThreadLocal 有四个方法
原创
博文更新于 2022.04.07 ·
2083 阅读 ·
0 点赞 ·
3 评论 ·
6 收藏

(十三)synchronized用法、底层原理,附四种锁范围详细例子

《深入理解Java虚拟机》一句话:当多个线程访问同一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替运行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获取正确的结果,那这个对象是线程安全的。1. 开篇内存分为主内存和工作内存,每个线程都有自己的工作内存,如何和主内存的数据同步,产生的数据不一致性,就是我们常说的线程安全,这就需要我们去了解Java内存模型了。借用一张图:如图为JMM抽象示意图,线程A和线程B之间要完成通信的话,要经历如下两步:
原创
博文更新于 2022.04.07 ·
3200 阅读 ·
6 点赞 ·
6 评论 ·
33 收藏

(十四)volatile的用法+为什么不能确保原子性+与synchronized的区别

volatile介绍volatile 的作用是保证变量在多线程之间的可见性。synchronized是阻塞式同步,会在线程竞争激烈的情况下,会升级为重量级锁,还可能会死锁;而volatile是一种轻量级的同步机制。在理解这个volatile可见性之前,需要先了解一下CPU高速缓存、Java内存模型的知识。主内存:java虚拟机规定所有的变量(不是程序中的变量)都必须在主内存中产生,为了方便理解,可以认为是堆区。可以与前面说的物理机的主内存相比,只不过物理机的主内存是整个机器的内存,而虚拟机的主内存
原创
博文更新于 2022.04.07 ·
958 阅读 ·
2 点赞 ·
0 评论 ·
3 收藏

(十二)yield、notify、notifyAll、sleep、join、wait 的区别

1. wait ,notify / notifyAll核心源码:public final void wait() throws InterruptedException { wait(0);}Object.wait(long)要跟Object.notify()/notifyAll()搭配使用。wait 与 notify/notifyAll 方法必须在synchronized 同步代码块中使用,即要先对调用对象加锁,不放在synchronized 中则会在program runtime
原创
博文更新于 2022.04.07 ·
821 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

(十)线程池参数——workQueue用法

线程池参数的 workQueue 决定了缓存任务的排队策略,对于不同的业务场景,我们可以使用不同的排队策略。我们只需要实现BlockingQueue 这个接口即可。介绍一下常用的有三种workQueue1. SynchronousQueueSynchronousQueue没有容量,是无缓冲等待队列,是一个不存储元素的阻塞队列,会直接将任务交给消费者(即丢给空闲的线程去执行),必须等队列中的添加元素被消费后才能继续添加新的元素,否则会走拒绝策略,所以使用SynchronousQueue阻塞队列一般要
原创
博文更新于 2022.04.07 ·
4835 阅读 ·
4 点赞 ·
2 评论 ·
12 收藏

(十一)sleep(1)、sleep(0)和sleep(1000)的区别

众所周知,sleep是让线程处于等待运行状态,不会占用CPU,OS会将执行时间分配给其它线程。sleep(0)字面意思是睡眠0毫秒,大家可能觉得跟没写一样,其实不是的。sleep(1000)比较容易理解,就是让线程睡眠1000毫秒,但是1000毫秒后,线程会执行吗,是立即执行吗?本篇文章主要是探究以上的问题。操作系统中,CPU竞争有很多种策略。Unix系统使用的是时间片算法,Windows属于抢占式。在时间片算法中,所有的进程排成一个队列。操作系统按照他们的顺序,给每个进程分配一段时间,即该进.
原创
博文更新于 2022.04.07 ·
19221 阅读 ·
18 点赞 ·
2 评论 ·
73 收藏

(九)线程池异常捕获

上一篇提到了使用ThreadFactory的UncaughtExceptionHandler去捕获线程池的错误,还有没有其他方法呢?线程的异常捕获可以使用try catch,但是主线程 如何 捕获子线程的异常呢?当一个线程执行出错了,接下来是否还要执行呢?1. try catch在子线程执行的方法体里面加上 try catch ,try catch 可以捕获当前线程的抛出的异常。但是try catch 无法捕获其他线程的错误。demo:public class OtherException {
原创
博文更新于 2022.04.07 ·
4494 阅读 ·
1 点赞 ·
1 评论 ·
10 收藏

(八)Callable和Runnable的区别

Callable和Runnable都是一个接口。Runnable@FunctionalInterfacepublic interface Runnable { /** * When an object implementing interface <code>Runnable</code> is used * to create a thread, starting the thread causes the object's * <
原创
博文更新于 2022.04.07 ·
1454 阅读 ·
2 点赞 ·
1 评论 ·
6 收藏

(七)线程池的大小如何确定

线程的使用目的是提高运行速度,提高运行的速度是要充分提用CPU和I/O 的利用率。这就涉及到CPU密集型程序和I/O密集型程序的区别了。CPU 密集型程序CPU密集型也叫计算密集型,指的是系统的硬盘、内存性能相对CPU要好很多,此时,系统运作大部分的状况是CPU Loading 100%,CPU要读/写I/O(硬盘/内存),I/O在很短的时间就可以完成,而CPU还有许多运算要处理,CPU Loading很高。比如说要计算1+2+3+…+ 1亿、计算圆周率后几十位、数据分析。都是属于CPU密集型程序
原创
博文更新于 2022.04.07 ·
3681 阅读 ·
2 点赞 ·
1 评论 ·
25 收藏

(六)ThreadPoolExecutor自定义线程池

上一篇中提到四种线程池的创建方式,最后还是会 new ThreadPoolExecutor(),所以 我们可以使用 new ThreadPoolExecutor()的方法创建自定义的线程。可以看到 ThreadPoolExecutor 是 ExecutorService的实现类:public class ThreadPoolExecutor extends AbstractExecutorService {}public abstract class AbstractExecutorServic
原创
博文更新于 2022.04.07 ·
1235 阅读 ·
1 点赞 ·
0 评论 ·
6 收藏

(五)四种线程池底层详解

Java中提供了四种线程池创建方法线程池名称描述newSingleThreadExecutor创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。newFixedThreadPool创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。newScheduledThreadPool创建一个可定期或者延时执行任务的定长线程池,支持定时及周期性任务执行。newCachedT
原创
博文更新于 2022.04.07 ·
1189 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

(四)为什么要使用线程池

阿里开发手册有一段描述:【强制】线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。说明:使用线程池的好处是减少在创建和销毁线程上所花的时间以及系统资源的开销,解决资源不足的问题。如果不使用线程池,有可能造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。上一篇文章介绍了Java线程是什么,以及用显式创建线程的两种方式(继承Thread类或者实现Runnable接口):1. 手动创建线程的缺点继承extend类或者实现runnable接口都是最简单创建线程的方式,但是这种方
原创
博文更新于 2022.04.07 ·
1148 阅读 ·
1 点赞 ·
0 评论 ·
7 收藏

(三)Java线程创建方式

我们平时用main方法执行的代码,都是以主线程去执行。如果要使用多线程,可以使用以下三种方式去创建:1. 继承Thread类class MyThread extends Thread { @Override public void run() { System.out.println(Thread.currentThread().getName() + "---->>>>" +"继承Thread类"); }}2. 实现Runnabl
原创
博文更新于 2022.04.07 ·
1026 阅读 ·
0 点赞 ·
0 评论 ·
1 收藏

(二)Java线程与系统线程,生命周期

1.操作系统中线程的5种状态在操作系统中,线程的生命周期可以分为5种状态:①new 关键字创建了Thread类(或其子类)的对象,或者Runnable。②Runnable 调用了start()方法,这时的线程就等待时间片轮转到自己这,以便获得CPU;第二种情况是线程在处于RUNNING状态时并没有运行完自己的run方法,时间片用完之后回到RUNNABLE状态;还有种情况就是处于BLOCKED状态的线程结束了当前的BLOCKED状态之后重新回到RUNNABLE状态。③Running:这时的线程指的是获
原创
博文更新于 2022.04.07 ·
792 阅读 ·
1 点赞 ·
0 评论 ·
2 收藏

(一)线程是什么

多线程可以实现并行处理,避免了某项任务长时间占用CPU时间。在单CPU计算机中,为了运行所有这些线程,操作系统需要为每个独立线程安排一些CPU时间,操作系统以轮换方式向线程提供时间片,在宏观上似乎这些线程都在同时运行。简单的说,就是更好的利用CPU的资源。1. 程序计算机程序,是指为了得到某种结果而可以由计算机等具有信息处理能力的装置执行的代码化指令序列,或者可以被自动转换成代码化指令序列的符号化指令序列或者符号化语句序列。2. 进程为了使程序并发执行,并且可以对并发执行的程序加以描述和控制,人.
原创
博文更新于 2022.04.07 ·
2016 阅读 ·
4 点赞 ·
0 评论 ·
20 收藏

(十八)Worker线程管理

转自:美团技术团队线程池为了掌握线程的状态并维护线程的生命周期,设计了线程池内的工作线程Worker。这也是线程回收的核心我们来看一下它的部分代码:private final class Worker extends AbstractQueuedSynchronizer implements Runnable{ final Thread thread;//Worker持有的线程 Runnable firstTask;//初始化的任务,可以为null}Worker这个工作.
转载
博文更新于 2022.04.07 ·
1562 阅读 ·
1 点赞 ·
1 评论 ·
4 收藏
加载更多