- 博客(52)
- 资源 (8)
- 收藏
- 关注
原创 Queue 系列
copyOnWriteArrayList 写时复制 插入数据的时候 先把原来的数据copy一份,在将元素插入进去,然后将引用指向新的值,这样写的时候加锁,读的时候不加锁为什么还需要复制 因为Array的长度是一定的之前的ArrayList 在读的时候 需要将写的进程停掉,才可以进行读Queue 是线程安全的offer 放数据成功返回true 失败返回falseadd 放数据失败,返回false,并抛出异常peek 读数据pool 取出数据(读并且删除掉)-----------..
2020-12-31 14:55:49 64
转载 ArrayList源码解析
1、概述ArrayList ,基于[]数组实现的,支持自动扩容的动态数组。相比数组来说,因为其支持自动扩容的特性,成为我们日常开发中,最常用的集合类,没有之一2、类图ArrayList 实现的接口、继承的抽象类实现了 4 个接口,分别是:(1)java.util.List接口,提供数组的添加、删除、修改、迭代遍历等操作(2)java.util.RandomAccess接口,表示 ArrayList 支持快速的随机访问(3)java.io.Serializabl...
2020-12-31 13:15:15 89
原创 java中强引用 弱引用 软引用 虚引用 总结
ThreadLocal 一个线程一个map(ThreadLocalMap) map的key 为当前对象ThreadLocal value为对应泛型的值ThreadLocal 的原理强引用: 平时定义变量 如 Student s = new Student(); s即强引用软引用 SoftReference<Student> s = new SoftReference<>(new Student()) 定义的变量为软引用 主要用于缓存,需要新的空间的时候,可以...
2020-12-30 20:57:05 156
转载 java 中的强引用 软引用 弱引用 虚引用
主要是为了更好的进行内存管理而设置的一套机制,粗俗的说就是不同的引用垃圾回收的力度不同。强引用:只要引用存在,垃圾回收器永远不会回收Object obj = new Object();obj.equels(new Object());//可直接通过obj取得对应的对象而这样 obj对象对后面new Object的一个强引用,只有当obj这个引用被释放之后,对象才会被释放掉,这也是我们经常所用到的编码形式。软引用:非必须引用,内存溢出之前进行回收,可以通过以下代码实现.
2020-12-30 20:03:45 94
转载 SpringDataJpa:JpaRepository增删改查
Jpa查询1. JpaRepository简单查询基本查询也分为两种,一种是spring data默认已经实现,一种是根据查询的方法来自动解析成SQL。 预先生成方法 spring data jpa 默认预先生成了一些基本的CURD的方法,例如:增、删、改等等继承JpaRepositorypublic interface UserRepository extends JpaRepository<User, Long> {} 使用默认方法 @Test
2020-12-30 11:01:01 427
原创 k8s中工具的区别
kubeadm是kubernetes集群快速构建工具kubeadm init --kubernetes-version=v1.14.1 --pod-network-cidr=10.244.0.0/16即master 和node1,node2 节点构建集群kubelet运行在所有节点上,负责启动POD和容器,以系统服务形式出现kubectl:kubectl是kubenetes命令行工具,提供指令kubectl get nodes#查看存在问题的podkubectl get pod
2020-12-28 20:00:35 82
转载 K8S基础概念
一、核心概念1、NodeNode作为集群中的工作节点,运行真正的应用程序,在Node上Kubernetes管理的最小运行单元是Pod。Node上运行着Kubernetes的Kubelet、kube-proxy服务进程,这些服务进程负责Pod的创建、启动、监控、重启、销毁、以及实现软件模式的负载均衡。Node包含的信息:Node地址:主机的IP地址,或Node ID。 Node的运行状态:Pending、Running、Terminated三种状态。 Node Condition:… N
2020-12-28 19:30:37 472
转载 EnableAsync使用技巧
SpringBoot项目中,有时候我们发现使用EnableAsync进行异步调用没有作用。分析原因:1. 异步方法使用@Async,没有确定:返回值为void或Future2. 异步方法和调用方法写在了同一类中,如果写在同一类中是没有效果的。实现EnableAsync进行异步调用两种方式:1.SpringBootApplication 启动类上,增加EnableAsync 启动异步注解2. 在对应的service实现类上加上EnableAsync 启动异步注解3. 如...
2020-12-28 18:21:29 796
原创 LockSupport
LockSupport是一个线程工具类,所有的方法都是静态方法,可以让线程在任意位置阻塞,也可以在任意位置唤醒。它的内部其实两类主要的方法:park(停车阻塞线程)和unpark(启动唤醒线程)。 如果线程先被unpark,再进行park,则直接放行import java.util.concurrent.TimeUnit;import java.util.concurrent.locks.LockSupport;public class LockSupportTest { publ
2020-12-25 13:14:10 116
转载 Semaphore 限流
Semaphore,是用于控制一组线程访问资源。举个例子,老师上课,同学需要上厕所,老师准备了3个令牌,拿到令牌的同学就可以去上厕所,上完厕所的同学需要归还令牌。这样就最多同时只有3名同学上厕所。这就是Semaphore的应用场景。 Semaphore的构造函数可初始化令牌数量、是否公平锁。如果是公平锁,先申请令牌的可以先获取。 acquire() 和release()分别是获取和释放令牌,acquire(int) 和release(int) 分别是获取和释放多个令牌。Semaphore...
2020-12-25 12:11:40 122
原创 ReentrantReadWriteLock
读写锁 可以生成两把锁 一个读锁(读锁共享锁),一个写锁(互斥锁)import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReadWriteLock;import java.util.concurrent.locks.ReentrantReadWriteLock;public class ReadWriteLockTest { static ReadWriteLock readWriteL.
2020-12-25 11:27:09 58
原创 Phaser的使用
分阶段进行,按照一定的流程执行,比如举行婚礼1、新郎新娘入场2、其它宾客入场3、所有人开始吃饭4、所有人离场5 新郎新娘洞房import java.util.concurrent.Phaser;import java.util.concurrent.TimeUnit;public class PhaserTest { static MarriagePhaser phaser = new MarriagePhaser(); static void milliSleep
2020-12-25 11:08:18 83
转载 CountDownLatch和CyclicBarrier
CyclicBarrier在用法上其实跟CountDownLatch十分相似,但是前者功能更加强大。CountDownLatch举例:CountDownLatch countDownLatch=new CountDownLatch(n); 当程序多次执行countDownLatch.countDown();导致计数器n=0时,阻塞的线程都将同时被唤醒。但是此时的n已经是等于0了,也就是说这个计数器就是一次性的。CyclicBarrier举例:CyclicBarrier cycl.
2020-12-25 10:46:23 95
转载 CountDownLatch 的用法
1.背景:countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。 存在于java.util.cucurrent包下。2.概念countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。(等待其它一组线程执行完毕后,该线程再执行,需要依赖其它线程的执行结果) 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器
2020-12-25 10:33:32 97
原创 一个线程持有锁后,同步方法可以交互执行吗
一个线程里面的多个同步方法不能同时进行,必须等待一个方法执行完以后,另一个才能执行,代码如下import java.util.concurrent.TimeUnit;public class ThreadSysnTest { int a = 0; synchronized void add(){ for(int i=0;i<10000000;i++){ a++; } } synchronized voi
2020-12-25 09:34:14 95
原创 synchronized 和ReentrantLock 的区别
锁类型:synchronized 悲观锁(排它锁、互斥锁)、非公平锁(当其它进程来的时候,如果锁已被占用,就必须wait,开始阻塞,等待锁释放。谁抢到归谁占有,不需要排队)synchronized 有一个锁升级的概念 从偏向锁(开始有资源争抢时)->轻量级锁(自旋锁 自旋=10)->重量级锁ReentrantLock 需要分情况调用lock()方法,获取到的锁就是悲观锁调用tryLock()方法,获取到的锁为CAS的,有一个指定时间的参数,这样无法锁定,或者在指定时间内...
2020-12-24 21:04:50 207 1
转载 悲观锁、乐观锁概念
一、并发控制当程序中可能出现并发的情况时,就需要通过一定的手段来保证在并发情况下数据的准确性,通过这种手段保证了当前用户和其他用户一起操作时,所得到的结果和他单独操作时的结果是一样的。这种手段就叫做并发控制。并发控制的目的是保证一个用户的工作不会对另一个用户的工作产生不合理的影响。没有做好并发控制,就可能导致脏读、幻读和不可重复读等问题。常说的并发控制,一般都和数据库管理系统(DBMS)有关。在 DBMS 中的并发控制的任务,是确保在多个事务同时存取数据库中同一数据时,不破坏事务的隔离.
2020-12-24 20:28:59 149 1
转载 ReentrantLock NonfairSync FairSync
结构首先看看ReentranLock结构,它实现Lock接口,也拥有Sync ,NonfairSync, FairSync三个内部类,( NonfairSync, FairSync )-----继承------->Sync ------继承-------> AbstractQueuedSynchronizerNonfairSync ,FairSync 重写了AQS 的 tryAcquire构造方式:public ReentrantLock() {sync =...
2020-12-24 20:19:02 126 1
原创 如何优化synchronized锁
锁细化 :只对需要争抢的资源加锁,不争抢的不加锁锁粗化: 若争抢资源比较激烈,这样可以把多个细锁,合成一个粗锁加锁的对象是final的 这样可以防止对象的指针移动,如Object o = new Object();synchronized(o){}如果在其他的线程中将o = new Object();即指针改变,则锁的对象就改变了,相当于锁失效...
2020-12-23 19:37:45 125
原创 volatile和synchronized对比
volatile并不能保证多个线程共同修改 代码块的代码 时所带来的不一致问题,也就是说volatile不能替代synchronizedvolitile 只能保证可见性不能保证原子性,即替代不了sysnimport java.util.ArrayList;import java.util.List;public class VolatileVsSync { volatile int count = 0; void m() { for (int i = 0; i < 10.
2020-12-23 19:30:49 347
原创 为什么Java中synchronized同步的对象不能是Integer、String、Long类型
原因是Java的自动封箱和解箱操作在作怪。这里的i++实际上是i = new Integer(i+1),所以执行完i++后,i已经不是原来的对象了,同步块自然就无效了Long 类型同理,String是因为String定义的变量会放在常量池中,如果多个线程定义的String变量的值相等,则锁无效String的值一致时指向的地址是一致的,其实两个线程锁的是同一个对象。而在实际工作中,String值相同的情况时有发生,而出现问题有不容易发现。...
2020-12-23 16:54:25 1024 1
转载 java中的CAS原理
一、什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(这个变体通常称为比较和设置),或通过返回从内存位置读取的值来完成(摘自维基本科) JAVA1.5开始引...
2020-12-23 16:44:41 91
原创 锁的几种状态
偏向锁有资源争用的时候升级为自旋锁自旋锁10次后 升级为重量级锁自旋锁 属于用户态的 占用cpu 适用:加锁的代码执行时间比较短,线程数量比较少重量级锁 os 内核态 不占用cpu 在旁边竞争的线程进入等待队列,等待不占用cpu资源,需要等待cpu唤醒 适用于: 执行时间长,线程数量比较多用系统锁锁只能升级不能降级...
2020-12-23 14:31:36 272
转载 偏向锁是什么
偏向锁操作流程偏向锁,顾名思义,它会偏向于第一个访问锁的线程,如果在接下来的运行过程中,该锁没有被其他的线程访问,则持有偏向锁的线程将永远不需要触发同步但是从我们跑的代码输出却看不到偏向锁这个东东。为啥对象实例化出来之后,对象头里是不支持偏向的呢?其实是JVM搞的鬼,JVM虽然默认启用偏向锁,但启动后4秒内并不支持。可以通过-XX:BiasedLockingStartupDelay=0参数将JVM启动后支持偏向锁的延迟时间设置为0,这样就可以看到偏向锁的输出了: 代码也改动一...
2020-12-23 14:27:22 2150
转载 对象头是什么东西
对象头,顾名思义,就是对象的头。对象是实例化出来的,实例化的前提是必须有类这个模板。举个不大恰当的例子,人类就是个类,你我他就是人类实例化出来的对象。我们的头,自然就是对象头。我们的头有口鼻眼耳,对象头也有一些东西,主要包含两部分:Mark Word(标记字)和Class Pointer(类指针),如果是数组对象还得再加一项Array Length(数组长度)。 对象头为啥要有这些东东?Mark Word用来标记运行时信息(每个对象各不相同),Class Pointer用来指向生成该对象所在的类(认祖
2020-12-23 14:12:11 2422
转载 可重入锁synchronized 和 ReentrantLock
JVM的 synchronized 是可重入锁,即可以多次获得相同的锁(就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁)new Thread(new Runnable() { @Override public void run() { synchronized (this) { System.out.println("第1次获取锁,这个锁是:" + this);
2020-12-23 13:11:47 137
原创 线程的join方法
join()方法的作用就是让主线程等待子线程执行结束之后再运行主线程。下面示例中t2 为主线程,需要等待子线程t1 执行完成再执行使用场景,线程2依赖于线程1执行的返回结果在线程2 中调用线程1的join方法,即把cpu资源让给线程1 public static void main(String[] args) throws Exception{ Thread t1 = new Thread(()->{ try { T.
2020-12-23 11:22:47 14465
转载 @Autowire和@Resource区别
介绍@Autowire和@Resource都是Spring支持的注解方式动态装配bean。详解@Autowire@Autowire默认按照类型(by-type)装配,默认情况下要求依赖对象必须存在。如果允许依赖对象为null,需设置required属性为false,即@Autowire(required=false)private InjectionBean beanName;如果使用按照名称(by-name)装配,需结合@Qualifier注解使用,即@Autowire
2020-12-22 17:46:24 885
原创 cmd 窗口执行java程序
javac HelloWorld.java文件然后执行java HelloWorld 运行java文件,输出执行结果。javac 执行时,报不是内部命令,需要查看环境变量配置是否正确执行完javac,再执行java 命令报找不到对应的类,这时需要将包名去掉执行java 命令,输出结果,中文乱码: 分析乱码出现的原因: 1)在文本编辑代码时,保存时编码为utf-8 2)在cmd中编译运行时默认的编码方式为gbk 3) 因为使用码表的不同而造成的乱码。 解决方法:..
2020-12-22 09:33:51 181
原创 提升QPS
提升QPS:提高并发数1. 能用多线程用多线程。2. 增加各种连接数:tomcat mysql redis等等。3. 服务无状态,便于横向扩展。扩机器。4. 让服务能力对等。(serviceUrl:打乱顺序)减少响应时间。1.异步(最终一致性,不需要及时),流量削峰2. 缓存。(减少db读取,减少磁盘io,读多,写少)3. 数据库优化。4. 多的数据,分批次返回。5. 减少 调用链。6. 长连接。不要 轮询一共从4个方面入手1.硬盘(mysql)2.内存(redis...
2020-12-21 16:08:11 395
原创 spring编写组件之分布式组件
引入maven依赖的相关jar包<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-integration</artifactId></dependency><dependency> <groupId>org.springframework.integra
2020-12-21 14:55:45 113
原创 java中采用lua脚本执行redis操作
1.lua的执行脚本,set数据 lock-set.lua--- 获取keylocal key = KEYS[1]--- 获取valuelocal val = KEYS[2]--- 获取一个参数local expire = ARGV[1]--- 如果redis找不到这个key就去插入if redis.call("get", key) == false then --- 如果插入成功,就去设置过期值 if redis.call("set", key, val) then
2020-12-21 10:56:53 3740 1
原创 分布式锁之红锁
部署多台独立的redis;redis的配置:package com.online.taxi.order.config;import org.redisson.Redisson;import org.redisson.api.RedissonClient;import org.redisson.config.Config;import org.springframework.beans.factory.annotation.Autowired;import org.springframewor
2020-12-21 09:53:47 1037
转载 Redis分布式锁之红锁
一、问题分布式锁,当我们请求一个分布式锁的时候,成功了,但是这时候slave还没有复制我们的锁,masterDown了,我们的应用继续请求锁的时候,会从继任了master的原slave上申请,也会成功。这就会导致,同一个锁被获取了不止一次。二、办法Redis中针对此种情况,引入了红锁的概念。三、原理用Redis中的多个master实例,来获取锁,只有大多数实例获取到了锁,才算是获取成功。具体的红锁算法分为以下五步:获取当前的时间(单位是毫秒)。使用相同的key和随机值在N个节点上请求锁。这里
2020-12-21 09:32:00 2575
原创 分布式锁之单个redis---Redisson
1.引入jar包,maven的相关依赖<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency> <dependency> <groupId>org.redisson</group
2020-12-19 18:47:10 197 1
原创 分布式锁之redis锁--手写redis
分布式锁,即同一个服务被部署成集群,这样就涉及到资源争抢的问题,单机的资源,直接用jvm内部的synchronized的锁就可以分布式锁的接口package com.online.taxi.order.service;public interface GrabService { /** * 司机抢单 * @param orderId * @param driverId * @return */ public String g
2020-12-18 18:39:30 203 1
原创 分布式锁之mysql锁
首先需要在数据库中创建一个表,对应共享资源的id(id)和抢占资源的标识(用户id),(该表和业务无关,只是为了解决抢占分布式资源问题)其它字段信息略网约车中司机抢单的场景创建表SET FOREIGN_KEY_CHECKS=0;-- ------------------------------ Table structure for tbl_order 业务表-- ----------------------------DROP TABLE IF EXISTS `tbl_order
2020-12-18 17:59:36 105 1
转载 String的Intern方法详解
引言 在 JAVA 语言中有8中基本类型和一种比较特殊的类型String。这些类型为了使他们在运行过程中速度更快,更节省内存,都提供了一种常量池的概念。常量池就类似一个JAVA系统级别提供的缓存。8种基本类型的常量池都是系统协调的,String类型的常量池比较特殊。它的主要使用方法有两种:直接使用双引号声明出来的String对象会直接存储在常量池中。 如果不是用双引号声明的String对象,可以使用String提供的intern方法。intern 方法会从字符串常量池中查询当前字符串是否存在,若
2020-12-18 17:20:41 1875 2
mysql-5.5.16
2015-11-28
PLSQL_Developer_7.1
2015-11-28
测试单元jar包
2015-06-07
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人