自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 简单工厂和策略模式的区别

简单工厂和策略模式在定义和使用过程上很相似,所以经常会混淆,这里总结一下它们的区别。

2023-04-09 17:14:23 212

原创 go实现策略模式

定义了算法(一些列实现不同功能的方法)家族,分别封装起来,让它们之间相互可以替换,此模式让算法的变化,不会影响到使用算法的客户。

2023-03-12 11:08:49 147

原创 go语言实现简单工厂模式

go语言实现简单工厂模式

2023-03-04 11:01:38 346

原创 ConcurrentHashMap

jdk1.7里面有Segment对象,使用他来实现分段锁,进而保证线程安全。jdk1.8就没有Segment对象了。jdk1.8ConcurrentHashMap的结构如下所示:jdk1.8ConcurrentHashMap实际上就是Node[]数组加链表的结构和HashMap一样jdk1.8的主要源码解析static class Node<K,V> implements Map.Entry<K,V> { final int hash; .

2021-08-28 14:23:58 87

原创 Java并发包JUC——ConcurrentHashMap

1.1分段锁机制Hashtable之所以效率低下主要是因为其实现使用了synchronized关键字对put等操作进行加锁,而synchronized关键字加锁是对整个对象进行加锁,也就是说在进行put等修改Hash表的操作时,锁住了整个Hash表,从而使得其表现的效率低下。因此,在JDK1.5~1.7版本,Java使用了分段锁机制实现ConcurrentHashMap.简而言之,ConcurrentHashMap在对象中保存了一个Segment数组,即将整个Hash表划分为多个分段;而每个Segmen

2021-07-15 15:15:07 141

原创 HashMap

本文是基于HashMap8.0来讨论的。首先讨论的是第一个方法://此方法的是返回一个大于并且最接近cap的一个2^n的数,比如我们传的参数是5,那么返回的就是16.至于为什么要这样做,主要是为了后面扩容的时候实现要么是库容前的数组元素的下标的等于扩容后的要么是库容前的2^n。 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1; n |= n &

2021-07-14 16:47:41 45

原创 JVM系列3-JVM内存结构之-堆

我们知道整个JVM内存中占用空间最大的结构就是堆了。如果你的电脑是双核4G那么JVM进程最多分配2G多点的内存,那么堆内存就会分配1G多一点。因为95%以上的对象都要放到堆中,java又是

2021-06-03 13:47:39 326

原创 JVM系列2-JVM内存结构

我们以分析下面的类为过程来讨论上面的每个模块。package JVM;import java.lang.ref.SoftReference;public class Test { public static int initData=1; public static User user=new User(); public static SoftReference<User> user1=new SoftReference<>(new User(..

2021-06-01 15:27:54 50

原创 JVM系列1-类加载机制

1.类加载过程项目里面的多个.java文件经过编译器打包成可运行的jar文件,最终由java命令运行主类的main函数启动整个项目,但是首先是需要类加载器(自己定加载器、或者应用程序加载器或者扩展类加载器或者启动类加载器)把主类加载到JVM。主类在运行过程中如果使用到了其他类,会逐步加载这些使用到的类,而不是一下全部加载到JM里面。下面是类加载到使用的整个流程如下所示:加载>>验证>>准备>>解析>>初始化>>使用>>卸载

2021-06-01 15:25:32 91

原创 Java多线程(11)

得到

2021-05-29 21:05:14 70

原创 2021-05-29

Java多线程(10)加法计数器CyclicBarrier现实生活中我们经常会遇到这样的情景,在进行某个活动前需要等待人全部都齐了才开始。上课时要等全部的学生人都到齐了才上课,比赛时要等运动员都上场后才开始,只有集齐七龙珠才能召唤神龙。意思就是等到所有的线程都准备好了到齐之后再执行下一步的行动。下面的动图很好的描述了这个场景:CyclicBarrier字面意思是“可重复使用的栅栏”,CyclicBarrier 相比 CountDownLatch 来说,要简单很多,其源码没有什么高深的地方,它

2021-05-29 20:38:44 44

原创 2021-05-21

Java多线程(9)SemaphoreSemaphore 通常我们叫它信号量, 可以用来控制同时访问特定资源的线程数量,通过协调各个线程,以保证合理的使用资源。主要用于那些资源有明确访问数量限制的场景,常用于限流。例如,停车场场景,车位数量有限,同时只能容纳多少台车,车位满了之后只有等里面的车离开停车场外面的车才可以进入。Semaphore的常用方法构造方法:允许访问资源的最大线程数量,默认为非公平锁。permits的值可以为负,当为负是,必须有线程去释放资源才能让其他线程再获取资源。

2021-05-21 10:40:10 34

原创 2021-05-21

Java多线程(8)工具类中CountDownLatch和SemaphoreCountDownLatchCountDownLatch是一个同步工具类,CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为正在执行的线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。CountDownL

2021-05-21 09:40:26 114

原创 2021-05-13

Java多线程(7)Lock锁和AQS

2021-05-13 11:32:41 85

原创 2021-05-12

Java多线程系列(6)synchronize定义:synchronize是Java提供的一个实现同步机制的一个关键字。它的加锁和解锁是JVM自动完成的,因此从锁的类型来说,他是一个隐式锁。synchronize锁住的是谁1.对象锁锁住的是调用该方法的对象的实例。案列:上面这中情况锁住的是phone的这个实例对象2.类锁锁住的是整个class类。案列:上述情况锁住的是整个class类。因为静态方法属于类,当类加载的是静态方法就有了,而且只被加载一次

2021-05-13 11:31:10 43

原创 2021-05-10

Java多线程(5)volatile关键字

2021-05-10 19:29:13 53

原创 2021-05-10

Java多线程系列(4)这小节我们来讲讲Java的内存模型。

2021-05-10 13:54:39 39

原创 2021-05-10

Java多线程系列(3)在Java多线程系列(1)我们提到过有关线程的基本定义,接下来我们具体讲解。定义进程:进程是计算机进行资源(CPU,IO设备,磁盘等都是计算机中的资源)分配的基本单位。通俗的说:在电脑上运行的一应用就是一个进程,比如说爱奇艺播放器,qq等都是一个进程。线程:线程是CPU执行和调度的基本单位。关系:每个进程可以有多个线程,线程之间共享进程的各种资源。每个进程都有独立的代码和数据空间(程序上下文),程序之间的切换会有较大的开销;线程共享代码和数据空间,每个线程都有自己

2021-05-10 13:49:31 158

原创 2021-05-10

缓存一致性协议(MESI)官方定义:MESI协议是基于Invalidate的高速缓存一致性协议,并且是支持回写高速缓存的最常用协议之一。个人理解:说白了就是为了保证主内存和多核CPU或者多CPU里面的缓存的数据在同一时刻都保持一致。如果是单CPU的单核的的就不需要使用缓存一致性协议,因为始终就一个CPU去访问数据不存在不一致的问题。为什么要使用MESI协议?首先我们来看一个场景:如下图所示如上图所示,当两个线程T1属于CPU1,T2属于CPU2同时访问主内存中的共享变量X=5时,首.

2021-05-10 10:49:26 58

原创 2021-05-10

多核CPU和多CPU的关系?计算机的组成我们知道现在的计算机都遵循冯诺依曼模型:每个计算机主要包括5大基本组成部分,运算器,控制器,存储器,输入和输出。如下图示:实线代表数据的流向,虚线代表控制流。根据上面的冯诺依曼计算机模型,现代计算机的组成如下所示:其中CU指的是控制器,ALU指的是计算机器。然后我们讨论一下CPU的运行原理,如下图所示:第一步:控制单元根据指令计数器(指令计数器(PC):存放当前欲执行指令的地址,具有计数功能(PC)+ 1)的值去主内存中找到下一步

2021-05-10 09:34:15 65

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除