Java
文章平均质量分 55
edanhuang
知道的越多不知道的越多
展开
-
【juc学习之路第9天】屏障衍生工具
在大部分的应用环境下,很多资源实际上都属于有限提供的,例如:服务器提供了4核8线程的CPU资源,这样所有的应用不管如何抢占,最终可以抢占的也只有这固定的8个线程来进行应用的处理,实际上这就属于一种有限的资源。在面对大规模并发访问的应用环境中,为了合理的安排有限资源的调度,在JUC中提供了 Semaphore(信号量)处理类。范例:使用信号量控制叫号系统CountDownLanch是一种基于倒计数同步的线程管理机制,例如:主线程里面创建了三个子线程,主线程必须在这三个子线程全部执行完成之后再继续向下执行,原创 2022-06-27 21:34:46 · 299 阅读 · 0 评论 -
【juc学习之路第8天】Condition
依据时间戳实现锁机制,用于解决读写锁在读写资源线程数量不平衡时,资源抢占不公平的情况。在该类中支持有三种锁的处理模式,分别为写锁、悲观锁、乐观锁。每一个完整的StampedLock是由版本和模式两个部分所组成,在获取相关锁时会返回有一个数字标记戳,用于控制锁的状态,并利用该标记戳实现解锁的处理。在最早学习到多线程技术的时候,会使用Object类之中提供的 wait、notify方法进行等待与唤醒的处理,而后在传统的Thread 类之中,又提供了暂停和恢复的功能(这个功能已经被废除),Condition实现了原创 2022-06-25 14:15:59 · 230 阅读 · 0 评论 -
【juc学习之路第7天】ReentrantLock与ReentrantReadWriteLock
线程锁位于jucl下,主要有两种接口类型的锁:Lock:包含以下三种形式锁的类型:公平锁:不同的线程获取锁的过程是公平的非公平锁:不同线程获取锁的过程是不公平的,允许竞争获取。可重入锁:同一个锁可以被一个线程多次获取,避免死锁的出现。ReadWhiteLock: 提供读锁和写锁,读时锁共享,修改时独占。ReentrantLock互斥锁或叫独占锁,是Lock的实现类,意思是一旦获取到锁之后,其他线程不允许再操作(无论读或写),synchronized也是互斥锁。先观察下Re原创 2022-05-25 23:33:34 · 125 阅读 · 0 评论 -
【juc学习之路第6天】并发计算器与线程随机因子
并发计算器有些时候不想用原子操作类但还想实现安全的计算,可以使用并发计算器,有两种计算器:累加器:DoubleAccumulator、LongAccumulator (需要初始化)加法器:DoubleAdder、LongAdderpublic class Main { public static void main(String[] args) throws Exception { DoubleAccumulator da = new DoubleAccumulator(原创 2022-05-24 23:21:31 · 146 阅读 · 0 评论 -
【juc学习之路第5天】引用原子类和属性修改器
引用原子类包含三种:AtomicReference: 引用类型原子类。实现原理:CAS。compareAndSet():无法通过匿名对象进行比较,因为比较的内容是地址而不是Obejct.equals()。AtomicStampedReference: 带有引用版本号的原子类。实现原理:CAS同时C版本号。compareAndSet():比较内容地址的同时对版本号做出比较。AtomicMarkableReference: 带有标记的引用原子类。实现原理:CAS同时C标记。compar原创 2022-05-23 22:47:53 · 193 阅读 · 0 评论 -
【juc学习之路第4天】基本原子类与数组原子类
基本原子类提供三个:AtomicInteger: public class AtomicInteger extends Number implements java.io.SerializableAtomicLong: public class AtomicLong extends Number implements java.io.SerializableAtomicBoolean: public class AtomicBoolean implements java.io.Serializab原创 2022-05-22 23:24:31 · 219 阅读 · 0 评论 -
java整合grpc
前提说明我们使用新版的proto3JDK(version >=1.8)步骤在本机安装protoc编译器mac: brew install protoclinux: apt install -y protobuf-compilerwin: https://github.com/protocolbuffers/protobuf/releases/download/v3.19.4/protoc-3.19.4-win64.zip(win用户可能需要配置环境变量,各位作为IT精英这里不赘述了)原创 2022-05-14 19:12:50 · 575 阅读 · 0 评论 -
问你今天星期几还在看日历?你需要了解下蔡勒公式
今天做了一道给日期求当天是星期几的简单题,虽然可以import date,但看到评论区上层同学金闪闪的蔡勒公式四个字,仅用一行简洁明快的公式指责我的无知,仿佛在说你太“蔡勒”,让我这种调用API的做法感到十分愧疚。蔡勒公式不具体解释这个公式的意思,这里给出一种比较好记的做法。简化公式计算1582年10月14日之后的公式可以写成:w = (y + y/4 - y/100 + y/400 + 1+ 2m + 3(m+1)/5 + d)%7;为了简化计算部分的代码,把上式中有关月份的代码拿出来先计算原创 2022-01-03 14:46:00 · 204 阅读 · 0 评论 -
【juc学习之路第3天】原生原子操作以及JUC原子操作的实现
在实际的业务场景中为了保证数据的安全性,原子操作是必不可少的,比如一些秒杀场景、银行存取款、火车票抢购等业务。为了模拟一下原子操作的必要性,我们实现一个不安全的抢票代码:public class Main { public static int ticket = 5; public static void main(String[] args) throws InterruptedException { for(int i = 0; i < 20; i ++) {原创 2021-12-18 00:54:13 · 151 阅读 · 0 评论 -
【juc学习之路第2天】ThreadFactory标准且优雅的创建线程方法
一般情况下创建线程我们都是这样创建的:for (int i = 0; i < 10; i ++) { new Thread(() -> { System.out.println("hello" + Thread.currentThread().getName()); }).start();}但这样的设计就不符合Java面向对象设计原则的标准了,而且如果我们有Alibaba Java Coding Guidelines也会发现提示不要显式创建线程。优雅永原创 2021-12-17 23:55:44 · 798 阅读 · 0 评论 -
【juc学习之路第1天】JUC简介以及TimeUnit的使用
简介JUCJUC是java并发编程中常用到的框架,其于JDK5中被提出,实现在java.util.concurrent包下,所以被人们广为称之JUC。它的核心理念是CAS、AQS,利用这两个理念,可以解决开发过程中的性能问题以及稳定性的问题,例如:想使用线程就要使用Runnable,Callable接口;想数据同步处理,要使用synchronized,但性能很差;想实现变量的数据更新,要是用volatile;想实现等待与唤醒,使用Object类中提供的wait()、notify();但有了上原创 2021-12-17 00:06:24 · 906 阅读 · 0 评论 -
操作系统作业调度算法Java-FCFS,SJF,HRN算法
package os.lesson2;import java.util.ArrayList;import java.util.List;class JCB{ private String name; // 作业名 private char state; // 作业状态 private int ts; // 提交时间 private float _super; // 优先权 private int tb; // 开始运行时间 private int t原创 2021-05-21 22:06:09 · 588 阅读 · 0 评论