自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 redis。

官网的说法我们先来认真看一下官网的说法。翻译过来大意如下:CPU并不是您使用Redis的瓶颈,因为通常Redis要么受内存限制,要么受网络限制。例如,使用在一般Linux系统上运行的流水线Redis每秒可以发送一百万个请求,因此,如果您的应用程序主要使用O(N)或O(log(N))命令,则几乎不会使用过多的CPU 。但是,为了最大程度地利用CPU,您可以在同一服务器上启动多个Redis实例,并将它们视为不同的服务器。在某个时候,单个实例可能还不够,因此,如果您要使用多个CPU,则可以开始考

2021-10-12 10:56:00 70

原创 docker联合文件系统

Docker镜像(Docker Images)Docker镜像就是包含了独立运行环境和开发的软件包。没有Docker时,部署环境需先安装OS、配置网络、JDK、Tomcat等等,还得把开发的程序打成jar或war包放上去。使用Docker后,Docker首先将OS、配置网络、JDK、Tomcat等等打包成一个镜像,直接拉取下来之后就能用。当然你也可以根据自己的需要,将OS、配置网络、JDK、Tomcat、jar或war等程序一起打包成一个镜像,这个时候使用和迁移都非常方便。类似于先在一个VM

2021-10-07 17:15:02 275

转载 Java 动态代理作用

作者:知乎用户链接:https://www.zhihu.com/question/20794107/answer/658139129来源:知乎著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。静态代理假设现在项目经理有一个需求:在项目现有所有类的方法前后打印日志。你如何在不修改已有代码的前提下,完成这个需求?我首先想到的是静态代理。具体做法是:1.为现有的每一个类都编写一个对应的代理类,并且让它实现和目标类相同的接口(假设都有)2.在创建代理对象时,通.

2021-09-16 13:12:38 111

转载 按照其性质分类锁

synchronized的优势synchronized是在JVM层面上实现的,不但可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中应用场景在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是Reetran

2021-09-10 10:10:39 71

原创 非公平锁和公平锁

公平锁:公平和非公平锁的队列都基于锁内部维护的一个双向链表,表结点Node的值就是每一个请求当前锁的线程。公平锁则在于每次都是依次从队首取值。锁的实现方式是基于如下几点:表结点Node和状态state的volatile关键字。sum.misc.Unsafe.compareAndSet的原子操作。非公平锁:在等待锁的过程中, 如果有任意新的线程妄图获取锁,都是有很大的几率直接获取到锁的。ReentrantLock锁都不会使得线程中断,除非开发者自己设置了中断位。ReentrantLo..

2021-09-10 09:42:26 161

原创 关于线程池

什么是线程池?线程池是一种多线程处理形式,处理过程中将任务提交到线程池,任务的执行交由线程池来管理。如果每个请求都创建一个线程去处理,那么服务器的资源很快就会被耗尽,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以被重复利用,可执行多个任务。为什么要使用线程池?创建线程和销毁线程的花销是比较大的,这些时间有可能比处理业务的时间还要长。这样频繁的创建线程和销毁线程,再加上业务工作线程,消耗系统资源的时间,可能导致系统资源不足。(我们可以把创建和销毁的线程的过程去掉)线程池

2021-09-08 17:02:11 96

原创 Java Lambda 表达式

在Java 8中,Java增加了对lambda表达式的支持,我们可以使用lambda表达式来代替匿名内部类的使用。我们在开发中最常用的匿名内部类可能就是new Runnable()了,所以我们就用它来举例:传统写法new Thread(new Runnable() { @Override public void run() { System.out.println("traditional method."); }}).start();使用lambda表...

2021-09-07 16:54:15 72

原创 volatile关键字

一.内存模型的相关概念  大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。  也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高

2021-09-07 12:56:32 64

原创 锁的加锁过程

1、轻量级锁的加锁过程  (1)在代码进入同步块的时候,如果同步对象锁状态为无锁状态(锁标志位为“01”状态,是否为偏向锁为“0”),虚拟机首先将在当前线程的栈帧中建立一个名为锁记录(Lock Record)的空间,用于存储锁对象目前的Mark Word的拷贝,官方称之为 Displaced Mark Word。这时候线程堆栈与对象头的状态如图2.1所示。  (2)拷贝对象头中的Mark Word复制到锁记录中。  (3)拷贝成功后,虚拟机将使用CAS操作尝试将对象的Mark Word更新为指向

2021-09-02 18:48:42 527

原创 launcher

JAVA Launcher简析sun.misc.Launcher类是java的入口,在启动java应用的时候会首先创建Launcher类,创建Launcher类的时候回准备应用程序运行中需要的类加载器。一、ClassLoaderLauncher作为JAVA应用的入口,根据双亲委派模型,Laucher是由JVM创建的,它类加载器应该是BootStrapClassLoader, 这是一个C++编写的类加载器,是java应用体系中最顶层的类加载器,负责加载JVM需要的一些类库(<JAVA_HOME&

2021-08-31 10:25:39 162

空空如也

空空如也

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

TA关注的人

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