并发编程
文章平均质量分 77
三少说
预则立,不预则废!
展开
-
leetcode1195. 交替打印字符串(java实现)
题目原题连接leetcode1195题目描述:编写一个可以从 1 到 n 输出代表这个数字的字符串的程序,但是:如果这个数字可以被 3 整除,输出 “fizz”。如果这个数字可以被 5 整除,输出 “buzz”。如果这个数字可以同时被 3 和 5 整除,输出 “fizzbuzz”。例如,当 n = 15,输出: 1, 2, fizz, 4, buzz, fizz, 7, 8, fizz, buzz, 11, fizz, 13, 14, fizzbuzz。假设有这么一个类:class F原创 2021-06-17 18:35:11 · 409 阅读 · 1 评论 -
redis 对单个key进行大数据量incr
利用 redis incr 做超高并发延迟累加器(一亿数量级)前景提要:公司有一个字段,需要支持 qps 为 1000万。 但是可以将结果作为延迟结果发送过来,比如 20秒发一次结果。但是不能直接 incr 1000万次,redis即使是集群 也扛不住。提示: redis只有在网络读取请求利用了多线程,在磁盘io等处理数据方面依然是单线程。思路: 多应用示例部署,利用多应用本地jvm缓存,来进行分流,各应用本地之间近行多线程本地累加。利用时间段来提交多应用的累加结果,此时再利用incr原子特性进行多原创 2021-04-09 18:17:17 · 1318 阅读 · 1 评论 -
LongAdder(浅谈)
LongAdder(浅谈)知识储备:**前提:**对于数值i++实现原子操作,我们有了AtmoicInteger和AtmoicLong。动机: 在学习Hystrix熔断保护的时候,根据过去的一段时间内失败的请求次数来判断是否打开熔断开关,所以他会维护一个时间窗口,并不断的向该窗口累加失败的次数,在多线程环境下,一般都会用Longadder,在jdk1.8引出的这个类,一起了解。作者注释:This class is usually preferable to AtomicLong when mult原创 2020-09-21 22:43:18 · 1889 阅读 · 0 评论 -
AQS随笔录
AQS随笔录简介: AQS(AbstractQueueSynchronizer),抽象的队列式同步器。Java除了提供了synchronized外的另一个同步机制,在java.util.concurrent.locks包。实现aqs的锁: 自旋锁,互斥锁、读写锁、条件产量、信号量、栅栏如何找到这个类: Lock lock = new ReentrantLock(); lock.lock()在可重入锁中我们的lock方法怎么执行 sync.lock();我们选择公平锁或非公平原创 2020-09-19 17:56:16 · 132 阅读 · 0 评论 -
list如何实现线程安全(通俗易懂且入门)
list实现线程安全线程不安全的展示:爆出异常:Exception in thread "11" java.util.ConcurrentModificationException代码public class CopyOnWriteArrayListTest { public static void main(String[] args) { // 1.演示并发修改失败,演示不安全的集合类 List<String> list = new原创 2020-09-18 11:48:47 · 2607 阅读 · 0 评论 -
使用synchronized实现ReentrantLock(美团面试题)
使用synchronized实现ReentrantLock前提知识:获取锁:如果当前线程和已经获取锁的线程是一样的,不用获得。如果当前锁不为空,已经被别人持有了,则进入等待队列。如果锁为空,且获取到锁,则把自己标志为上锁。释放锁:如果当前线程和获取锁线程不一致不能释放。如果释放后我们需要唤醒等待队列。代码实现:package com.yang.leetcode.other;import java.util.Random;import java.util.concurrent原创 2020-09-17 20:13:53 · 176 阅读 · 0 评论 -
消费者生产者(Java实现,精准通知)
消费者生产者(Java实现)概述生产者消费者顾名思义,消费者消费生产者生产的东西。放到Java代码中如何理解?我们调一个方法,去改变共享变量,共享变量是多个线程通信的媒介。也可以这样理解,我们线程是我们代码的执行,如果A线程执行需要B线程的支持或者有一定的依赖关系,那么我们需要两个线程之间通信,A线程改变了共享变量后通知B线程,同理B线程改变了共享变量后通知A线程。管程法实现我们用代码实现(管程法:定义一个共享池,共享变量是多个的时候)package com.yang.kuangTea原创 2020-09-13 20:36:46 · 346 阅读 · 1 评论 -
线程在工作中的应用
线程在工作中的应用由于我们工作写的代码要求解耦,所以我们的类还是我们平时写的类,只是我们需要一个线程类去操作我们平时写的类请看该文章的最后一部分Callable进阶实现(点我)synchronized和lock区别 参考(点我)使用synchronized实现首先我们写一个我们平时写的类(SaleTicket)我们写一个测试类我们通过lambda表达式简写我们线程类package com.yang.kuangTeacher;/** * @author: fudy * @dat原创 2020-09-13 20:35:18 · 1266 阅读 · 0 评论 -
Java中Lock(synchronized和lock区别)
Java中Lock(synchronized和lock区别)首先我们要明白,lock锁是后出的(1.5),肯定是弥补了部分的不足,一起认识下他们的区别synchronized是内置的关键字(功能统一),Lock锁是一个类,在java.util.concurrent.locks下的(功能可以改变的)。由于synchronized是悲观锁,他会一直等等待对象头锁信息,阻塞的,不可被打断的。而Lock可以判断是否获取锁,并且可以不一定等待获取到锁。可以结束自己synchronized是自动上锁和自动释原创 2020-09-13 20:30:31 · 1210 阅读 · 0 评论 -
Java死锁代码演示(史上最通俗理解)
Java死锁代码演示死锁的概念知识储备对象锁:Java一切皆对象,每个类都有一个class文件。由class文件可以new出对象,我们简单认识 下java对象,对象有个对象头信息,也就是这个对象概述,其中一条信息就是对象锁,也就是我们当前对象有没有被锁定,被哪个引用锁定。synchronized:synchronized是java关键词,如果运用到方法上代表我们锁的是这个方法,如果我们锁的代码块,代表再这个代码块内我们持有这个锁,Java Effective也是提倡减小锁的范围。我们进入同步代码原创 2020-09-13 13:14:22 · 2440 阅读 · 2 评论 -
java实现线程的三种方式(史上最通俗易懂)
线程实现的三种方式实现Runnable接口(底层 实现)继承Thread类实现Callable接口(进阶)实现Runnable接口 先看Runnable源码,是我们1.0版本就有的且在java.lang包下的package java.lang;/* * @author Arthur van Hoff * @see java.lang.Thread 线程类继承了Runnable * @see java.util.concurrent.Callable原创 2020-09-11 21:26:39 · 1107 阅读 · 4 评论 -
volatile(粗浅理解)
(一)阅读指导 1.本文站在设计者角色进行思考。 2.知其然,知其所以然。 3.没有完美东西,请遵循应用场景。 (二)发展历史(设计者角度)注:以下谓语 ‘我‘ 仅仅代表Java设计者(虽然是不正确的理解) 1.在我发布了Java1.5之前,当时的业务场景是单核市场,我们并没有预料到Java会发展的如此庞大。当时我们考虑到所谓的并发编程,我们利用的是原语级别的指令(),当然这时会阻塞其他的线程,因为我们称之为同步代码块。我们用synochrized关键词原创 2020-08-24 22:33:30 · 940 阅读 · 4 评论