
多线程
逆风GLORY
Stay Hungry, Stay Foolish. – Steve Jobs
展开
-
实战Springboot内置Tomcat配置调优
我们在使用springboot(版本:2.0.3.RELEASE)开发web项目时,大多数时候采用的是内置的Tomcat(当然也可以配置支持内置的jetty),内置Tomcat有什么好处呢?1、方便微服务部署,减少繁杂的配置2、方便项目启动,不需要单独下载web容器,如Tomcat,jetty等。#云服务器配置12核心,24G内存,java启动jar命令:nohup $JAVA_HOME/bin/java -server -Xms10240m -Xmx14336m -Xmn9216m -X转载 2020-12-20 18:17:54 · 1053 阅读 · 0 评论 -
多线程环境下,如何提高程序运行效率
目录1、应用CAS2、方法、对象加synchronized3、对象加Lock()1、应用CAS避免了并发冲突,无锁,不会阻塞其他线程。在计数方面,应用较为典型:public class Counter { private int count; public Counter(){} public synchronized int getCount(){ return count; } public synchronized.原创 2020-12-13 22:27:30 · 520 阅读 · 0 评论 -
Java虚拟机对锁的优化
jdk1.6以后,JVM对 synchronized 锁进行了优化:锁消除 锁消除是 JIT编译器对synchronized 锁的优化,在编译的时候,JIT编译器会通过逃逸分析技术,来分析synchronized 锁对象,如果只可能被一个线程加锁,这个时候编译就不用加入monitorenter 和 monitorexit 的指令。锁粗化 JIT编译器发现代码里多次加锁释放锁,会给合并为一把锁。偏向锁 monitorenter 和 monitore...原创 2020-11-20 12:54:49 · 184 阅读 · 0 评论 -
synchronized底层如何保证原子性、可见性、有序性
原理原子性:加锁和释放锁;可见性:加了Load屏障和Store屏障,释放锁flush数据,加锁会refresh数据;有序性:Acquire屏障和Release屏障,保证代码块内部可以重排,但是代码块内部和代码块外部的指令是不能重排的。保证原子性java对象是分为对象头和实例变量两块,其中实例变量就是对象那些变量数据,然后对象头包含了两块内容,一是 Mark Word(含hashCode、锁数据、GC数据等),另一个是Class Metadata Address(包含了指向类的元数据指针)转载 2020-11-19 21:27:25 · 1820 阅读 · 0 评论 -
进程kill不掉怎么办
问题背景:公司内部的一套发布系统,每次部署,启动git仓库所指代码,并且启动时不是直接通过java -jar 启动的,是属于发布系统内的子进程,当子进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构。导致我们在kill时不能杀掉。可通过如下方法处理ps -aux 查看进程状态,如果 STAT 是 Z,那么就是一个僵尸进程。ps -ef | grep 进程id 找到父进程id通过kill掉父进程来杀死这个进程。僵尸进原创 2020-11-19 14:19:24 · 5296 阅读 · 0 评论 -
Java底层角度聊聊volatile关键字原理
简介volatile是Java提供的一种轻量级的同步机制。Java语言包含两种内在的同步机制:同步块(或方法)和volatile变量,相比于synchronized(synchronized通常称为重量级锁),volatile更轻量级,因为它不会引起线程上下文的切换和调度。但是volatile变量的同步性较差(有时它更简单并且开销更低),而且其使用也更容易出错。Java内存模型的特性原子性:同一时刻仅可有一个线程可以执行变更; 有序性:程序的执行按照代码的先后顺序执行 可见性:多线程...转载 2020-11-05 15:27:19 · 125 阅读 · 0 评论 -
线程池的底层工作原理
线程池的好处降低资源消耗:通过重复利用已经创建的线程降低线程创建和销毁造成的消耗; 提高响应速度:当任务到达时,任务可以不需要等到线程创建就能执行; 提高线程的可管理性:线程是稀缺资源,不能无限创建,否则会消耗系统资源、降低系统的稳定性,使用线程可以进行统一分配,调优和监控线程池的创建jdk自带创建线程池的四种常见方式:Executors.newFixedThreadPool(int):创建一个固定线程数量的线程池,可控制线程最大并发数,超出的线程需要在队列中等待。注意它内部coreP..转载 2020-11-04 17:01:55 · 239 阅读 · 0 评论 -
AQS实现原理
定义AQS 全称为AbstractQueuedSynchronizer,它提供了一个FIFO队列,可以看成是一个用来实现同步锁以及其他涉及到同步功能的核心组件,常见的有:ReentrantLock、CountDownLatch等。AQS是一个抽象类,主要是通过继承的方式来使用,它本身没有实现任何的同步接口,仅仅是定义了同步状态的获取以及释放的方法来提供自定义的同步组件。AQS的两种功能从使用层面来说,AQS的功能分为两种:独占和共享独占锁,每次只能有一个线程持有锁,比如ReentrantL转载 2020-11-04 15:04:41 · 222 阅读 · 0 评论 -
ConcurrentHashMap实现线程安全的底层原理
JDK1.8之前版本:分段加锁会将HashMap数组分成小数组,每个小数组对应于一个锁;即 线程1更新了数组1[5],而线程2更新了数组2[20],是可以同步更新的。JDK1.8进行了优化:减少锁的粒度还是一个数组,对数组中每个元素进行加锁,采取的是CAS策略。...原创 2020-11-04 11:20:12 · 216 阅读 · 0 评论 -
CAS底层原理
CAS (Compare and set)CAS 在底层硬件级别会保证操作原子性,同一时间只有一个线程执行CAS,先比较再设置,其他线程同时间CAS会失败原创 2020-11-04 08:02:46 · 174 阅读 · 0 评论 -
synchronized关键字底层原理
synchronized关键字底层原理public class SynchronizedDemo { public void method() { synchronized (this) { System.out.println("synchronized操作"); } }}通过 JDK 自带的 javap 命令查看 SynchronizedDemo 类的相关字节码信息:首先切换到类的对应目录执行 javac Syn转载 2020-11-04 07:49:43 · 213 阅读 · 0 评论