ConcurrentHashMap详解
前言作为java面试当中非常典型的问题,刚毕业的时候就看了不少相关八股文,今天还是再来回顾一下吧。
whatConcurrentHashMap 是 JUC 包提供的线程安全集合类, Concurrent 类型的容器有以下特点:
内部很多操作采用 CAS 机制,一般可以提供较高的吞吐量
弱一致性:
遍历时弱一致性,例如,当利用迭代器遍历时,如果容器发生修改,迭代器仍然可以继续进行遍 历,这时内容是旧的
求大小弱一致性,size 操作未必是 100% 准确
读取弱一致性 ConcurrentHashMap 中不仅仅采用了 CAS 机制,还提供了锁分段的技术来提高并发访问率。
HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁,假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术。首先将数据分成一段一段地存储,然后给每一 ...
VirrtualBox和VMware简单对比两者都是优秀的虚拟机平台,我们可以通过它们创建虚拟机来安装不同环境的操作系统
主要区别对比:
VirtualBox是开源免费软件,下载和安装比较方便,VMware功能更加强大,但是需要注册码
VirtualBox相对于VMware安装和配置更加简单,运行内存占用也比较小
VirtualBox由于是开源免费,社区相对更加活跃,但总体两者出现问题都能找到解决方案
常见的网络模型主要有下面四种网络模型
桥接(Bridge Adapter)
NAT
主机网络(Host-only Adapter)
内部网络(Internal)
VirtualBox包含了以上的四种网络模型,VMware只有前三种
四种模型之间的差别
桥接桥接网络模型依赖虚拟交换机(Linux bridge)将虚拟机和物理机连接起来,它们之间处在同一个二层网络
虚拟机和物理机的ip处在相同网段之下,举例,比如都处在192.168.100.x的网段之下,物理机ip为192.168.100.10,虚拟机ip为192.168.100.20
桥接网络的网络连通总结:
虚拟机之间彼此互通
...
注解@LoadBalancedLoadBalanced没有@import什么的,只有一个@Qualifier
LoadBalancerAutoConfiguration在LoadBalancerAutoConfiguration中用了@LoadBalanced将所有具有负载均衡标识的RestTemplate类型的Bean注入到集合中
12345@Bean@LoadBalancedpublic RestTemplate restTemplate(){ return new RestTemplate();}
使用一般这样使用
参考
Ribbon中@LoadBalanced注解的原理
前言看到掘金又是让大家写2021自己的感悟,我也来凑凑热闹,回顾一下我的2021。
毕业一年半是啊,我是2020年毕业的,到现在已经一年多了吧,这一年在社会上经历过的毒打可真是不少啊,下面就请听我一一道来。
刚毕业的工作选择在2020年初的时候,爆发了疫情,相信大家也都知道了,我是侥幸提前回到了家,在学校时候,是在准备考研,过了考研考试之后就回家了,回家之后,感觉自己考的不行,于是就开始在家在b站开始自学java,学了几个月后,得到了我确实没有考上研,连国家线都没有过,伤心难过一段时间之后就开始准备面试了。当时的我,由于疫情原因,也没有去参加春招,只能就是在boss上投简历,然后面试,不记得具体情况了,反正就是自己在没有工作的压力下,最终去了家乡省会的一个公司,这家公司的总公司在北京,省会的只是一个分公司。我在找工作的时候,一直想找的都是java后端的工作,结果自己由于太焦虑,感觉自己毕业了,连个工作都找不到,于是就急急忙忙的选择了一家公司,这个工作并不是我想要的java后端的工作,而是一种画图的工作,这家公司干到八月底的时候,觉得不行,还是要去找java开发的工作,等着内部转岗都不知 ...
CountDownLatch源码解析
使用场景
在一个任务需要多个线程来执行,并且是需要线程在同一时间一起开始执行,这样的话,可以使用CountDownLatch
本质
虽然CountDownLatch这个类并没有直接继承AbstractQueuedSynchronizer,但是他使用的一个final修饰的变量sync继承AbstractQueuedSynchronizer,所以其本质上还是使用了AQS的共享模式
这个类的作用实际上就是在线程开始之后设置了一个栅栏,这个栅栏将所有线程阻塞住了,只有所有线程都激活的情况下,栅栏才会消失
图解
源码分析Sync12345678910private static final class Sync extends AbstractQueuedSynchronizer { private static final long serialVersionUID = 4982264981922014374L;//实际上这个count相当于AQS中的state Sync(int count) { se ...
我的初恋
谈起初恋,大家可能有很多想法,有很多人说,初恋总是让他们念念不忘,有句俗语说的好“念念不忘,必有回响”,但是如果是放在初恋这件事儿上,就不是很适合。大家可能会疑惑,你初恋就初恋,为什么要在上面加个双引号那?哈哈哈哈哈哈哈哈哈哈哈,不要着急,请往下看,看完这篇文章,你也许就知道是什么原因了。下面请大家跟着我的思绪一起飞到我的高中时代。我的高中,是在我们市的排名第二个高中,虽然说是排名第二,但是它与第一的差距很大,排名第一的高中上个什么一本的人很多,甚至清华,北大都是有的,而我那个高中,可能只有排名非常靠前的人,可以考上所谓的一本。(当然你们这个时候,还分什么一本,二本,三本,我就不知道了)记得,我们俩的相遇是在我们的高一,我们俩去的是我们那个高中的所谓的实验班,实验班一共有两个班,我俩是在一个班,高中的我是一个胖胖的孩子,肥嘟嘟的脸可能比较招女孩喜欢吧 。我记得我们两个好像是因为排座位,坐到了一起,成为了同座,慢慢的,不知怎么的,她就开始摸我的脸了,一开始我还有些抵触,感觉有点像宠物,在被主人抚摸的感觉,后来慢慢的,就习惯了,而她也越来越喜欢摸我的脸,几乎每天都有吧。时间突 ...
你猜猜
不同点其实第一种情况和第二次情况,都是在tryAcquire这个方法的差别,
tryAcquire1234567891011121314151617181920protected final boolean tryAcquire(int acquires) { final Thread current = Thread.currentThread(); int c = getState(); if (c == 0) { if (!hasQueuedPredecessors() && compareAndSetState(0, acquires)) { setExclusiveOwnerThread(current); return true; } } else if (current == getExclusiveOwnerThread()) { int next ...
了解一下
基本属性1234567891011121314151617// 头结点,你直接把它当做 当前持有锁的线程 可能是最好理解的private transient volatile Node head;// 阻塞的尾节点,每个新的节点进来,都插入到最后,也就形成了一个链表private transient volatile Node tail;// 这个是最重要的,代表当前锁的状态,0代表没有被占用,大于 0 代表有线程持有当前锁// 这个值可以大于 1,是因为锁可以重入,每次重入都加上 1private volatile int state;// 代表当前持有独占锁的线程,举个最重要的使用例子,因为锁可以重入// reentrantLock.lock()可以嵌套调用多次,所以每次用这个来判断当前线程是否已经拥有了锁// if (currentThread == getExclusiveOwnerThread()) {state++}private transient Thread exclusiveOwnerThread; //继承自AbstractOwn ...
bytemd使用
初步使用首先是根据bytemd中md的教程来进行操作。我这里使用的是vue版本的。
首先你要创建或者有一个vue项目(我是新创建的vue项目)
结构了解主要是分为编辑和查看两个页面
编辑是Editor
查看是View
安装bytemd1npm install @bytemd/vue
新建一个test页面123456789101112131415161718192021222324252627282930313233<template> <Editor :value="value" :plugins="plugins" @change="handleChange" /></template><script>//这里就是引入所有的扩展的插件import 'bytemd/dist/index.min.css'import { Editor} from '@bytemd/vue'i ...
彻底理解
前言IOC 这个词估计是估计接触过spirng的人都知道的,就是所谓的控制反转,主要思想其实就是软件设计思想中的依赖倒置,讲真,我学了java一年多,spring的这个主要特点,ioc看了不少,但是还是没有太明白,就是一直不晓得,在没有ioc之前是怎么会回事儿,没有对比,也不太知道它的优点在哪里。终于在这篇文章中给到我想要的答案。
what在我的理解中,IOC的核心思想其实就是它的中文翻译过来的意思,控制反转,那么是谁的控制在反转那? 是在new一个对象的时候的反转,用一个非常简单的例子来讲解,你就会明白了。 比如说一台汽车,他是如何设计的那?首先肯定是要画出他的模型,那么一台汽车都有什么部件那?
车身
底盘
轮子在这里只是将车分为这三部分进行讨论,就这样最终形成一个完整的汽车,这中就有依赖关系,也就是默认的依赖关系是
这就是所谓的上层依赖下层,下层控制上层的意思。
但是使用了IOC之后那,这类比汽车就是说,给了你一个零件,需要你自己来找其他的零件来组成汽车。步骤应该是:
首先肯定是考虑自己有了轮胎,那么轮胎要装在哪里那?应该是放在汽车底盘的下方
有了底盘,汽车肯定 ...