Java知者
码龄10年
关注
提问 私信
  • 博客:103,964
    103,964
    总访问量
  • 79
    原创
  • 1,444,428
    排名
  • 38
    粉丝
  • 0
    铁粉

个人简介:知者,知无不言的知者

IP属地以运营商信息为准,境内显示到省(区、市),境外显示到国家(地区)
IP 属地:浙江省
  • 加入CSDN时间: 2014-10-11
博客简介:

Qynwang的博客

查看详细资料
个人成就
  • 获得59次点赞
  • 内容获得12次评论
  • 获得304次收藏
  • 代码片获得6,642次分享
创作历程
  • 79篇
    2023年
成就勋章
TA的专栏
  • Redis
    9篇
  • RabbitMQ实现消息发送的基础组件封装
    15篇
  • Nginx+LVS+keepalived实现高可用架构
    4篇
兴趣领域 设置
  • 编程语言
    java
  • 大数据
    redis
  • 后端
    mysqlspringspring boot架构分布式
  • 搜索
    elasticsearch
  • 服务器
    linux
创作活动更多

超级创作者激励计划

万元现金补贴,高额收益分成,专属VIP内容创作者流量扶持,等你加入!

去参加
  • 最近
  • 文章
  • 代码仓
  • 资源
  • 问答
  • 帖子
  • 视频
  • 课程
  • 关注/订阅/互动
  • 收藏
搜TA的内容
搜索 取消

控制并发流程,做好线程间的协调

线程一般是由线程调度器自动控制的,但有些场景需要按照我们程序员的意愿去实现多线程之间相互配合,从而满足业务逻辑。让线程A等待线程B执行完后再执行等一些相互合作的逻辑;或一系列线程等待一个线程运行完毕或发出信号之后再执行CountDownLatch(int count):仅有这一个构造函数,参数count为需要倒数的数值。await(): 调用 await() 方法的线程会被挂起,它会等待直到count值为0才继续执行。
原创
发布博客 2023.06.15 ·
572 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java并发容器 & 并发队列

阻塞队列是具有阻塞功能的队列,所以它首先是一个队列,其次是具有阻塞功能通常,阻塞队列的一端是给生产者放数据用,另一端给消费者拿数据用。阻塞队列是线程安全的,所以生产者和消费者都可以是多线程的阻塞队列的分为有界和无界,有界是指队列存储容量有限,无界队列是指存储容量无限大,如 LinkedBlockingQueue 的存储容量为 Integer.MAX_VALUE,约为2的31次方,可近似认为是无界队列。
原创
发布博客 2023.06.14 ·
892 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

final&不可变性

如果对象在被创建后,状态就不能被修改,那么它就是不可变的这个对象不能被修改指:对象指向(引用)不可变字段不可变成员变量不可变案列演示:person对象,age和name属性都不能再变/*** 不可变的对象,演示其他类无法修改这个对象* public也不行final String name = "李白";
原创
发布博客 2023.06.13 ·
468 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java并发之原子类

Java中提供了一些原子类,原子类包装了一个变量,并且提供了一系列对变量进行原子性操作的方法。原子性的意思是对于一组操作,要么全部执行成功,要么全部执行失败,不能只有其中某几个执行成功。在多线程的情况下能够保证操作不会被中断,从而能保证并发安全Java8引入高并发下LongAdder比AtomicLong效率高,本质还是空间换时间竞争激烈的情况下,LongAdder会把不同线程对应到不同的Cell上进行修改,降低冲突的概率,是多段锁的理念,提高了并发性。
原创
发布博客 2023.06.13 ·
1111 阅读 ·
0 点赞 ·
0 评论 ·
4 收藏

java并发之CAS(Compare and swap)

CAS的底层调用native方法,最终是利用CPU的一个特殊指令,该指令由CPU保证了原子性,而且包含多个操作,比如先比较再更新。(1)需要读写的内存值(V)、原值(A)和新值(B)。如果V的值与原值A相匹配,那么把B设置给V,否则处理器不做任何操作。(2)无论哪种情况,都返回V内存值。(3)原子类里,当失败时,就一直循环,直到成功。(1)、(2)是在CPU和内存的层面来说的,(3)是在Java层面说的int var5;
原创
发布博客 2023.06.13 ·
273 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

Java并发之 Lock 锁

锁是一种工具,用于控制对共享资源的访问Lock和synchronized是最常见的两个锁,他们都能够达到线程安全的目录,但是使用和功能上又有较大的不同Lock接口最常见的实现类就是通常情况下Lock只允许一个线程访问共享资源,特殊情况也允许多个线程并发访问,如ReadWriteLock的ReadLock悲观锁认为:如果我不锁住这个资源,别人就会来争抢,就会造成数据结果错误,所以为了结果的正确性,悲观锁会在每次获取并修改结果时把数据锁住,让别人无法访问。
原创
发布博客 2023.06.13 ·
2528 阅读 ·
5 点赞 ·
0 评论 ·
18 收藏

Java并发工具之ThreadLocal

ThreadLocal 字面意思是本地线程,其实更准确来说是线程局部变量,线程类 Thread 有个变量叫做 threadLocals,其类型就是ThreadLocal.ThreadLocalMap 类型,他其实不是一个 Map 类型,但可以暂时理解它是一个Map,键为 ThreadLocal 对象,值就是要存入的value。
原创
发布博客 2023.06.13 ·
5200 阅读 ·
9 点赞 ·
1 评论 ·
18 收藏

死锁细究!

发生在并发中互不想让:当两个(或更多)线程(或进程)相互持有对方所需要的资源,又不主动释放,导致所有人都无法继续前进,导致程序陷入无尽的阻塞,这就是死锁。多个线程造成死锁的情况如果多个线程之间的依赖关系是环形,存在环路的锁的依赖关系,那么也可能会发送死锁虽然线程并没有阻塞,也始终在运行(所以被称为“活锁”,线程是“活的”),但是程序却得不到进展,因为线程始终重复做同样的事如果是死锁,只会是等待,不会消耗CPU资源,但活锁除了程序无法进行,还会消耗 cpu 资源。
原创
发布博客 2023.06.09 ·
421 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

java线程池

如果线程池当前的线程数多于corePoolSize ,其中多余的那部分线程空闲时间超过keepAliveTime,它们就会被终止,比如:corePoolSize 为5,当前线程数为10,如果线程空闲了,就会恢复到5;如果线程池的大小超过了处理任务所需要的线程,那么就会回收部分空闲(60秒不执行任务)的线程,当任务数增加时,此线程池又可以智能的添加新线程来处理任务。核心线程池大小, 线程池初始化后,默认是没有任何线程的,当新的任务到线程池后,线程池会创建新的线程(即使有空闲线程),直到核心线程池已满。
原创
发布博客 2023.06.06 ·
447 阅读 ·
1 点赞 ·
0 评论 ·
1 收藏

牛郎织女的幸福生活(活锁)

*** 吃饭的人/*** 是否饥饿} }eatWith()/*** 方法里面描述的是吃饭的事* @param spoon 勺子* @param spouse 夫妻对方//如果勺子不是自己的,则等一会儿,等对方吃完 if(spoon . getOwner()!} //先检查对方是否饥饿,如果对方饥饿的话先把勺子交给对方,让对方先吃 if(spouse . isHungry) {
原创
发布博客 2023.06.03 ·
419 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

哲学家就餐问题(死锁)

本文主要讲述死锁的一个经典案例—哲学家就餐问题,并对该问题进行修复。
原创
发布博客 2023.06.03 ·
953 阅读 ·
4 点赞 ·
0 评论 ·
6 收藏

银行转账问题(死锁)

本文主要讲述死锁的一个经典案例—银行转账问题,并对该问题进行定位、修复。
原创
发布博客 2023.06.03 ·
925 阅读 ·
2 点赞 ·
0 评论 ·
3 收藏

Java内存模型

从Java代码到CPU指令的变化过程是怎样的?最开始,我们编写的Java代码,即*.Java文件在执行编译Javac命令后,从刚才的*.Java文件会变出一个新的Java字节码文件,即*.class文件JVM会执行刚才生成的*.class字节码文件,并把字节码文件转化为机器指令机器指令可以直接在CPU上执运行,也就是最终的程序执行。
原创
发布博客 2023.06.03 ·
3448 阅读 ·
0 点赞 ·
0 评论 ·
13 收藏

单例模式8种写法

我们可以结合代码,假如A线程进入同步代码块执行 instance = new Singleton6(),执行到“instance = memory 设置instance指向刚分配的内存”,这个时候B线程在第一次执行“if (instance == null)”,发现instance不为空,直接返回instance实例,其实线程B得到的这个实例并没有完全初始化(A还没有执行完对象的初始化步骤)就已经使用了。:线程不安全,还有性能问题!:使用到的时候才会创建对象,不会造成各种资源浪费问题,线程安全。
原创
发布博客 2023.06.03 ·
366 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

synchronized 关键字

synchronized 关键字解决的是多个线程之间访问资源的同步性,用于保证在同一时刻最多只有一个线程执行该段代码,以达到保证并发安全的效果。其中前两种使用的锁称为对象锁,后两种称为类锁。只能等执行完锁定代码块或者遇到异常才能退出。不能中断一个正在试图获得锁的线程。每个锁仅有单一的条件(某个对象)试图获得锁时不能设定超时时间。无法知道是否成功获取到锁。加锁和释放锁的时机单一。
原创
发布博客 2023.06.03 ·
159 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

volatile 关键字

volatile是一种同步机制,类似于 Lock 和 Synchronized ,但是他更轻量级,因为使用 volatile 并不会发生上下文切换等开销很大的行为。如果一个变量被volatile修饰,那么JVM会认为这个变量可能会被并发修改,会保证关于这个变量的修改能立即被其他线程看到。因为开销小,所以能力也小;他做不到像 synchronized 那样的原子保护,使用的场景比较有限。
原创
发布博客 2023.06.03 ·
1914 阅读 ·
1 点赞 ·
0 评论 ·
8 收藏

多线程安全的案例展示与解决方案

当多个线程访问一个对象时,如果不用考虑这些线程在运行时环境下的调度和交替执行,也不需要进行额外的同步,或者在调用方进行任何其他的协调操作,调用这个对象的行为都可以获得正确的结果,那这个对象是线程安全的。通俗来说就是:不管业务中遇到怎么的多个线程访问某个对象或某个方法的情况,而在编写这个业务逻辑的时候,都不需要额外做任何额外的处理(也就是可以像单线程编程一样),程序也可以正常运行(不会因为多线程而出错),就可以称为线程安全。
原创
发布博客 2023.06.03 ·
443 阅读 ·
0 点赞 ·
0 评论 ·
0 收藏

多线程的未捕获异常类 UncaughtExceptionHandler 的使用

*** 自定义 UncaughtExceptionHandler*/@Overridelogger.log(Level.WARNING,"线程异常:"+t.getName(),e);System.out.println(name+"我捕获了异常"+t.getName()+"异常名字:"+e);
原创
发布博客 2023.06.03 ·
1940 阅读 ·
0 点赞 ·
0 评论 ·
3 收藏

线程的四个属性

线程的四个属性。
原创
发布博客 2023.06.03 ·
1239 阅读 ·
0 点赞 ·
0 评论 ·
2 收藏

wait,notify,notifyAll,sleep,join等线程方法的全方位演练

因为java中每个对象都有一把称之为monitor监控器的锁,每个对象头中有一个用来保存锁信息的位置,所以每个对象都可以上锁,这个锁是对象级别的,而非线程级别的,wait/notify/notifyAll也都是锁级别的操作,他们的锁属于对象,所以把他们定义在Object类中最合适,因为Object类是所有对象的父类。
原创
发布博客 2023.05.27 ·
369 阅读 ·
0 点赞 ·
1 评论 ·
1 收藏
加载更多