- 博客(876)
- 资源 (649)
- 收藏
- 关注
转载 java并发synchronized 锁的膨胀过程(锁的升级过程)深入剖析(1)
我们先来说一下我们为什么需要锁?因为在并发情况为了保证线程的安全性,是在一个多线程环境下正确性的概念,也就是保证多线程环境下共享的、可修改的状态的正确性(这里的状态指的是程序里的数据),在java程序中我们可以使用synchronized关键字来对程序进行加锁。当声明synchronized代码块的时候,编译成的字节码将包含monitorenter指令和monitorexit指令。这两种指令均会消耗操作数栈上的一个引用类型的元素(也就是 synchronized 关键字括号里的引用),作为所要加..
2021-02-02 15:52:34 1064
转载 JVM启动参数
不管是YGC还是Full GC,GC过程中都会对导致程序运行中中断,正确的选择不同的GC策略,调整JVM、GC的参数,可以极大的减少由于GC工作,而导致的程序运行中断方面的问题,进而适当的提高Java程序的工作效率。但是调整GC是以个极为复杂的过程,由于各个程序具备不同的特点,如:web和GUI程序就有很大区别(Web可以适当的停顿,但GUI停顿是客户无法接受的),而且由于跑在各个机器上的配置不同(主要cup个数,内存不同),所以使用的GC种类也会不同(如何选择见GC种类及如何选择)。本文将注重介绍JVM、
2021-01-31 10:51:54 126
转载 AtomicStampedReference源码分析
之前的文章已经介绍过CAS的操作原理,它虽然能够保证数据的原子性,但还是会有一个ABA的问题。 那么什么是ABA的问题呢?假设有一个共享变量“num”,有个线程A在第一次进行修改的时候把num的值修改成了33。修改成功之后,紧接着又立刻把“num”的修改回了22。另外一个线程B再去修改这个值的时候并不能感知到这个值被修改过。 换句话说,别人把你账户里面的钱拿出来去投资,在你发现之前又给你还了回去,那这个钱还是原来的那个钱吗?你老婆出轨之后又回到了你身边,还是你原来的那个老婆吗?
2021-01-29 11:09:57 175
转载 原子性 atomic 类用法
当程序更新一个变量时,如果多线程同时更新这个变量,可能得到期望之外的值,比如变量i=1,A线程更新i+1,B线程也更新i+1,经过两个线程操作之后可能i不等于3,而是等于2。因为A和B线程在更新变量i的时候拿到的i都是1,这就是线程不安全的更新操作,通常我们会使用synchronized来解决这个问题,synchronized会保证多线程不会同时更新变量i。 import java.util.concurrent.CountDownLatch;public class UnSa..
2021-01-27 23:44:23 306
转载 CAS的ABA问题描述 AtomicStampReference
CAS的ABA问题描述在CAS操作的时候,其他线程将当前变量的值从A改成B,又改回A; CAS线程用期望值A与当前变量比较的时候,发现当前变量没有变,于是CAS就将当前变量进行了交换操作,但其实当前变量改变过,这与设计思想是不符合的; ABA问题的解决思路:每次当前变量更新的时候,将当前变量的版本号加1;AtomicStampReference示例public boolean compareAndSet( V expectedReference, V newReference, int
2021-01-27 22:18:46 204
原创 spring boot redis 分布式锁
yml文件 redis: host: 112.35.123.178 port: 40197 password: redisroot timeout: 5000 database: 0 jedis: pool: min-idle: 0 max-idle: 8 max-active: 8 max-wait: -1RedisConfig.javaimport...
2021-01-27 17:09:30 490
转载 CompareAndSwap原子操作原理
在翻阅AQS(AbstractQueuedSynchronizer)类的过程中,发现其进行原子操作的时候采用的是CAS。涉及的代码如下: 1: private static final Unsafe unsafe = Unsafe.getUnsafe(); 2: private static final long stateOffset; 3: private static final long headOffset; 4: pri
2021-01-26 14:37:29 827
转载 happens-before规则和as-if-serial语义
概述本文大部分整理自《Java并发编程的艺术》,温故而知新,加深对基础的理解程度。指令序列的重排序我们在编写代码的时候,通常自上而下编写,那么希望执行的顺序,理论上也是逐步串行执行,但是为了提高性能,编译器和处理器常常会对指令做重排序。1) 编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。2) 指令级并行的重排序。现代处理器采用了指令级并行技术来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。3) 内存系统的重排
2021-01-25 21:15:28 162
转载 java 8大happen-before原则超全面详解
再来重复下八大原则:单线程happen-before原则:在同一个线程中,书写在前面的操作happen-before后面的操作。 锁的happen-before原则:同一个锁的unlock操作happen-before此锁的lock操作。 volatile的happen-before原则:对一个volatile变量的写操作happen-before对此变量的任意操作(当然也包括写操作了)。 happen-before的传递性原则:如果A操作 happen-before B操作,B操作happen-
2021-01-25 21:10:53 401
转载 wait放弃对象锁_Java线程中wait、await、sleep、yield、join用法总结
wait()、notify()、notifyAll()用法obj.wait()/obj.wait(long timeout)是Object中的方法,当线程调用wait()方法,当前线程释放对象锁,进入等待队列。 obj.notify()/obj.nogifyAll()是Object中的方法,唤醒在此对象上wait()的单个或者所有线程。测试代码:public class ThreadWaitNotify {public static void main(String[] args) th
2021-01-24 10:41:33 320
转载 synchronized 和Lock区别
synchronized实现原理Java中每一个对象都可以作为锁,这是synchronized实现同步的基础:普通同步方法,锁是当前实例对象 静态同步方法,锁是当前类的class对象 同步方法块,锁是括号里面的对象 当一个线程访问同步代码块时,它首先是需要得到锁,当退出或者抛出异常时必须要释放锁,那么它是如何来实现这个机制的呢?我们先看一段简单的代码:package cn.alibab.javap;public class SynchronizedTest { public
2021-01-24 10:29:30 102
转载 ABA问题
CAS:对于内存中的某一个值V,提供一个旧值A和一个新值B。如果提供的旧值V和A相等就把B写入V。这个过程是原子性的。CAS执行结果要么成功要么失败,对于失败的情形下一班采用不断重试。或者放弃。ABA:如果另一个线程修改V值假设原来是A,先修改成B,再修改回成A。当前线程的CAS操作无法分辨当前V值是否发生过变化。关于ABA问题我想了一个例子:在你非常渴的情况下你发现一个盛满水的杯子,你一饮而尽。之后再给杯子里重新倒满水。然后你离开,当杯子的真正主人回来时看到杯子还是盛满水,他当然不知道是否被人喝
2021-01-24 10:05:24 127
转载 原子操作类AtomicInteger详解
为什么需要AtomicInteger原子操作类?对于Java中的运算操作,例如自增或自减,若没有进行额外的同步操作,在多线程环境下就是线程不安全的。num++解析为num=num+1,明显,这个操作不具备原子性,多线程并发共享这个变量时必然会出现问题。测试代码如下:public class AtomicIntegerTest {private static final int THREADS_CONUT = 20;public static int count = 0;p.
2021-01-24 09:50:03 417
转载 CountDownLatch的理解和使用 多线程同步器
CountDownLatch的理解和使用在笔者想要了解Thrift时候,找到一个博主写的系统间通信技术的架构设计,在了解和学习的过程中遇到很多小问题和基础知识,自己还是不够清楚,就查询和总结下。因为笔者也都是从网上找的一些资料,好的资料笔者都是自己收敲一遍,这样觉得能够加深下印象,引发更多的思考,毕竟很多时候笔者感觉自己都是七秒的记忆。在第一篇文章中遇到了一个CountDownLatch同步计数器,当计数器数值减为0时,所有受其影响而等待的线程将会被激活,这样保证模拟并发请求的真实性。Cou
2021-01-24 09:40:39 162
转载 CAS和AQS
CAS全称(Compare And Swap),比较交换Unsafe类是CAS的核心类,提供硬件级别的原子操作。// 对象、对象的地址、预期值、修改值public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);缺点:开销大:在并发量比较高的情况下,如果反复尝试更新某个变量,却又一直更新不成功,会给CPU带来较大的压力 ABA问题:当变量从A修改为B在修改回.
2021-01-24 09:33:05 191
转载 disruptor 介绍
一、背景1.来源Disruptor是英国外汇交易公司LMAX开发的一个高性能队列,研发的初衷是解决内部的内存队列的延迟问题,而不是分布式队列。基于Disruptor开发的系统单线程能支撑每秒600万订单,2010年在QCon演讲后,获得了业界关注。2.应用背景和介绍据目前资料显示:应用Disruptor的知名项目有如下的一些:Storm, Camel, Log4j2,还有目前的美团点评技术团队也有很多不少的应用,或者说有一些借鉴了它的设计机制。Disruptor是一个高性能的线程间异步通信
2021-01-24 09:29:33 617
转载 Redis+AQS
前言对于java的单进程应用来说,存在资源竞争的场景可以使用synchronized关键字和Lock来对资源进行加锁,使整个操作具有原子性。但是对于多进程或者分布式的应用来说,上面提到的锁不共享,做不到互相通讯,所以就需要分布式锁来解决问题了。废话不多说,直接进入正题,下面结合AQS和Redis来实现分布式锁。代码中大部分都是参考ReentrantLock来实现的,所以读者可以先去了解一下ReentranLock和AQS参阅:http://www.importnew.com/27477.html
2021-01-24 09:25:35 247
转载 jvisualvm安装Visual GC插件
给jdk自带的jvisualvm安装Visual GC插件,遇到We're sorry the java.net site has closed(我们很抱歉java.net网站已经关闭)1、找到新的更新地址visualvm新访问地址:https://visualvm.github.io/index.html进入“Plugins”,找到对应自己JDK版本的更新地址2、进入jvisualvm的插件管理"工具" - "插件"在"设置"中修改url地址为刚才我们在github上找到的
2021-01-24 08:32:19 201
原创 jvm指令码
建议直接复制保存至本地,研究jvm运行,执行指令非常有帮助一、未归类系列A此系列暂未归类。指令码 助记符 说明0x00 nop 什么都不做0x01 aconst_null 将null推送至栈顶二、const系列该系列命令主要负责把简单的数值类型送到栈顶。该系列命令不带参数。注意只把简单的数值类型送到栈顶时,才使用如下的命令。比如对应int型才该方式只能把-1,0,1,2,3,4,5(分别采用iconst_m1,iconst_0, iconst_1, iconst_2, iconst_3,
2021-01-23 16:43:35 213
原创 JMM模型到并发编程
电脑:内存 L1 L2 L3 缓存 CPU ctrl+atl+del就可以看到Java 有线程内存,在执行线程的时候,会从主内存把变量加载到工作内存(缓存),所以,在多线程同时改变一个静态变量时候,实际是分开相互不影响的下面是程序例子以下是运算结果从此可以看出,第一个线程并没有退出,initFlag因为在第一个线程没有变成false,因为是工作内存如果想让第一个内存的变量改变,加一个修饰 volatile工作原理在没有加v...
2021-01-22 23:58:52 390
转载 ShardingSphere分库分表实战
ShardingSphere是一套开源的分布式数据库中间件解决方案组成的生态圈,它由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar(计划中)这3款相互独立的产品组成。 他们均提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、容器、云原生等各种多样化的应用场景。 ShardingSphere定位为关系型数据库中间件,旨在充分合理地在分布式的场景下利用关系型数据库的计算和存储能力,而并非实现一个全新的关系型数据库。 它与NoSQL和
2021-01-22 11:06:08 559 1
原创 几张图可以理解GC JVM调优的内容
Javap -p 和Javap -v 可以查看.class文件的源码文件到指令码,程序计数器:code部分是 程序计数器的部分 代表当前执行的行操作数栈:是从局部变量表里拿出变量计算使用的临时栈动态链接:栈内执行方法与方法区里加在类的方法 映射使用的指针方法出口:就是栈帧结束后,返回到上一方法的code地址堆:放new 的方法本地方法栈:比如thread下native的start0 是调用windows下c++产生的start0方法,时候,临时使用的栈方法区:元空间 存放 ...
2021-01-22 10:23:41 250
转载 基于redis分布式锁实现的多线程并发程序
前两个版本的代码 都或多或少存在一定的问题,虽然可能微乎其微,但是程序需要严谨再严谨,第一个版本问题: 局限于单机版,依赖于 Jvm的锁 第二个版本问题: 极端情况下,解锁逻辑的问题,线程B的锁,可能会被线程A解掉,这种情况实际上是不合理的。1. 由于是客户端自己生成过期时间,所以需要强制要求分布式下每个客户端的时间必须同步。 2. 当锁过期的时候,如果多个客户端同时执行jedis.getSet()方法,那么虽然最终只有一个客户端可以加锁,但是这个客户端的锁的过期时间可能被其他客户端覆盖。.
2021-01-22 00:46:53 710
转载 Java——线程锁,死锁,等待唤醒机制
一、线程锁线程安全问题其实,线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。由于线程休眠的特性,从哪休眠就从哪继续执行(一个线程的事情还没干完就被其他线程挤下去了),回来继续干就会导致操作的全局变量或静态变量出现问题。为了解决这个问题,我们就需要让线程执行完毕(不能被其他线程挤下去),以下是几种解决办法。1、同步代码块
2021-01-22 00:17:15 450 1
原创 K8S相关内容
常用工具:docker linux k8s kubeadm概念etcd 数据库 类似redisapi server 接口对外提供api 调用 可以命令 kubectl 或者 kube-proxy,能访问etcd,事件总线scheduler 调度决策的组件 掌握新的情况,进行决策及分布pod放在哪些nodecontroller 定时监控 保证实际和预期一样work节点kubelet 资源管理者 在api server上container runtime 来管理容器 启动 关闭容器 收集..
2021-01-21 23:43:33 230 1
转载 Java基于redis实现分布式锁(SpringBoot)
前言分布式锁,其实原理是就是多台机器,去争抢一个资源,谁争抢成功,那么谁就持有了这把锁,然后去执行后续的业务逻辑,执行完毕后,把锁释放掉。可以通过多种途径实现分布式锁,例如利用数据库(mysql等),插入一条记录(唯一索引),谁插入成功,谁就持有锁;还可通过zookeeper来实现分布式锁,谁创建节点成功,谁就持有锁。本文介绍通过redis来实现分布式锁。本文使用springboot提供的RedisTemplate来操作redis,可以参考我之前的文章【快学springboot】13.操作red
2021-01-21 23:39:36 252
转载 Rancher中的服务升级实验
创建一个空的应用myAPP,在myAPP应用中,创建一个服务nginx-test,包含2个容器副本,使用nginx:1.13.0镜像。假设使用一段时期以后,nginx的版本升级到1.13.1了,如何将该服务的镜像版本升级到新的版本?实验步骤及截图如下:步骤截图:01-添加一个服务-名称nginx-test,含2个容器,选择镜像nginx:1.13.002-服务nginx-test采用nginx 1.13.0版本,服务升级前的状态03-点击升级按钮04-升级到下一个版本,...
2021-01-15 09:40:25 467 1
转载 docker 启动的 jenkins 中调用宿主机docker进行build
前言期初有这个需求感觉就跟套娃一样,你在docker 中调用docker,笑哭……这个也太逗了。不过的确遇到了,因为jenkins 容器中没有docker ,所以在编译 docker build 的时候 会出现 docker command 不存在。好吧,解决他!解决其实也很简单,把宿主机的 docker.socket 和 docker 挂在到容器内部,就可以使用了docker-composeversion: "3"services: jenkinsServer: im
2021-01-14 20:40:55 1065 1
转载 squirrel-foundation-demo
一个简单的squirrel-foundation-demo利用状态机模拟一个订单的支付过程。squirrel-foundation没有任何严重的依赖关系,因此基本上它应该是高度可嵌入的。squirrel-foundation没有整合spring框架,所以首先要用spring集成squirrel-foundation。spring集成squirrel-foundation(1).通过Spring创建StateMachineBuilder实例(单例);(2).业务函数中通过(1)的StateMachi
2021-01-14 15:15:30 751
转载 Spring基于状态机squirrel-foundation简单使用
squirrel-foundation的一些使用方法在百度上资料还是比较少,我是根据以下三个大佬写的文章借鉴的,在这里记录一下。1、squirrel-foundation-demo2、Squirrel使用(中文文档)3、squirrel-foundation状态机的使用细节我在这里直接粘贴代码,便于自己之后理解。 /** * 通过Spring创建StateMachineBuilder实例,通过buidler创建状态机(单例) * 创建无类型化状态机,简化状态机,防.
2021-01-08 17:16:04 1328
转载 状态机
背景1.很多文章都分享过状态管理的相关方案,方案和具体业务相关性强,可以给我们提供通用的设计思路与方法论,很难提供一些通用工具组件出来 2.本次调研的主要目的是,提供实现状态引擎可以共用的工具组件,来提高状态管理相关的开发效率,避免重复造轮子 3.本次主要调研了业界常用的、开源的、社区文档说明较多的两种方案 4.spring-statemachine是spring官方提供的状态机实现 5.squirrel-foundation是一个开源的轻量级的状态机实现(马蜂窝交易系统、美团ERP研发中心方案
2021-01-08 09:58:42 732
原创 c#扫描图片去黑边(扫描仪去黑边)
/// <summary> /// 自动去除图像扫描黑边 /// </summary> /// <param name="fileName"></param> public static void AutoCutBlackEdge(string fileName) { //打开图像 Bitmap bmp = OpenImage(fi...
2020-12-15 10:18:02 1194
转载 java main方法里调用mapper
在main方法中调用mybatis的mapper,一次性执行导入数据功能package com.runxsoft.test;import com.runxsoft.iutils.common.utils.UserUtils;import com.runxsoft.superwe.base.SqlVo;import com.runxsoft.superwe.base.mapper.ProtogenesisMapper;import com.runxsoft.superwe.valueCard..
2020-12-10 10:30:40 4327
转载 Oracle字符分隔函数(split)
为了让 PL/SQL 函数返回数据的多个行,必须通过返回一个 REF CURSOR 或一个数据集合来完成。REF CURSOR 的这种情况局限于可以从查询中选择的数据,而整个集合在可以返回前,必须进行具体化。Oracle 9i 通过引入的管道化表函数纠正了后一种情况。表函数是返回整个行的集(通常作为一个集合)的函数,可以直接从 SQL 语句中进行查询,就好像它是一个真正的数据库表一样。管道化表函数与之相似,但是它像在构建时一样返回数据,而不是一次全部返回。管道化表函数更加有效,因为数据可以尽可能快地返回。
2020-11-03 11:30:06 1078
转载 docker linux k8s kubeadm
一. 安装docker1.添加yum国内依赖yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo2.安装dockeryum -y install docker-ce docker-ce-cli containerd.io3.启动dockersystemctl start docker4.添加开机自启systemctl ...
2020-10-31 20:05:15 198
转载 Windows NAT端口映射
Windows本身命令行支持配置端口映射,条件是已经安装了IPV6,启不启用都无所谓,我在win7和server2008上是可以的。xp,2003装了ipv6协议也是可以的。CMD下操作增加端口映射,将10.10.10.10的8080映射到10.10.10.11的80端口netsh interface portproxy add v4tov4 listenport=8080 listenaddress=10.10.10.10 connectport=80 connectaddress=10.10.
2020-10-31 13:01:57 444
转载 2020-10-26java 实现pdf转换成图片
<dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.9</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --&g.
2020-10-26 17:49:06 357
转载 Java多线程 ——线程基础和锁锁锁
Java多线程(一) 一、线程的定义 二、Synchronize线程同步 三、偏向锁、自旋锁、重量级锁 四、volatile关键字 4.1.普通变量运算的物理意义 4.2.有无解决的方案 4.3.volatile的几个特性(参考https://www.cnblogs.com/kubidemanong/p/9505944.html) 五、Compare And Swap无锁自旋优化技术和ABA版本号机制 5.1.CAS操作原理 5.2.atomic包 5
2020-10-26 17:15:17 164
转载 hping3工具DOS攻击实验
需要两台机器,一台扮演攻击源,另一做目标源。 攻击源地址:10.0.40.4 被攻击机器地址:10.0.40.246 2 被攻击的机器上安装tcpdump,tcpdump主要是用来抓包的,看看网络数据包是否到达。 $yum install tcpdump -y 3 首先开启tcpdump抓取来自攻击源的数据包,其他数据包应该过排除。 $tcpdump -i eth0 src host 10.0.40.4 -i 是选择哪个网卡 ...
2020-10-16 10:56:35 3075 1
加特林压力测试代码示例 gatling stress test samples
2022-05-24
LSB隐写术 C#源代码
2021-05-17
de4dot.zip
2020-06-01
H5-Kline-master.zip
2020-03-19
使用SpringBoot整合jersey 实现Restful web service.同时整合springmvc。
2020-02-23
Spring Boot 拦截器+kibana 配置.zip
2019-09-04
SKU 相关代码及知识
2019-01-23
Face++ C# Demo实现web API 人脸比对,识别等接口
2019-01-05
ELK6.2.4搭建
2018-11-15
最新百度地图API Javascript V2.0 离线版本。 完全脱离百度在线地图, 有比较完善的示例Demo, 默认带有全国8级地图
2018-11-13
Fiddler4 以及证书https
2018-11-07
FiddlerCertMaker
2018-11-01
.net2.0 Mysql
2018-10-24
ELK( ElasticSearch、Logstash和Kiabana)
2018-07-20
eureka-server+gateway-service+user-service+zipkin-server
2018-07-18
vue 一套前端框架
2018-05-31
weUI 入门教程:http://blog.csdn.net/libin_1/article/details/50734266
2018-05-17
PostMan工具离线安装
2018-04-17
DsoFramer_KB311765_x86.exe 微软官方office控件,其中含源码,C、C++、Web 三种demo
2018-04-13
使用springboot集成jseesite
2018-03-28
Windows Server 2008 + tomcat 配置使用SSL.docx
2018-02-23
C# idx1-ubyte idx3-ubyte转图片 文字 浏览器
2018-01-04
TensorFlowSharp-master
2018-01-02
tensorflow 摄像头调用 Inception v1分类 vs2017 C#
2018-01-02
Docker 快速安装caffe步骤
2017-12-21
快速安装caffe步骤
2017-12-21
EM抛硬币算法
2017-12-20
ID3 算法 决策树使用的算法与阿里巴巴Java开发手册(终极版)
2017-12-15
Netica贝叶斯
2017-12-14
Mysql安装Linux
2017-12-13
docker离线安装 linux
2017-12-08
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人