JAVA
文章平均质量分 84
湫兮若风
这个作者很懒,什么都没留下…
展开
-
ThreadLocal详解
ThreadLocal详解1. ThreadLocal1. ThreadLocal定义:提供线程局部变量;一个线程局部变量在多个线程中,分别有独立的值(副本)。特点:简单(开箱即用)、快速(无额外开销)、安全(线程安全)。场景:多线程场景(资源持有、线程一致性、并发计算、线程安全等场景)。实现原理:java中使用哈希表实现。应用范围:几乎所有提供多线程特征的语言。...原创 2020-03-07 20:29:37 · 245 阅读 · 0 评论 -
单例模式-最优雅解法
文章目录1. 双层检查2. 内部类Holder3. 使用enum作为单例1. 双层检查public class SingletonDemo1 { private static SingletonDemo1 instance; private SingletonDemo1() { } /** * 双层null检查. * 优点: 在于最多...原创 2019-07-06 20:55:08 · 377 阅读 · 0 评论 -
Java-Class Loader
文章目录1. 类加载的三个阶段2. java 类主动使用1. 类加载的三个阶段三个阶段:加载: 查找并加载类的二进制数据。链接:验证:确保被加载类的正确性。准备:为类的静态变量分配内存,并将静态变量初始化为默认值。解析:将类中符号引用变为直接引用。初始化:为类的静态变量,赋予正确的初始值。2. java 类主动使用在java规范中, 只有类被首次主动使用的时候...原创 2019-07-18 12:17:01 · 110 阅读 · 0 评论 -
多线程-读写锁模式
文章目录1. 读写锁实现1. 读写锁实现/** * 读写锁 * 1. 写写加锁 * 2. 读写加锁 * 3. 写都加锁 * 4. 读读不加锁 * */public class ReadWriteLock { private int readingReaders = 0; // 正在读线程数 private int waitingReaders = 0; //...原创 2019-07-18 13:42:40 · 139 阅读 · 0 评论 -
java并发工具包-countDownLatch
目的:并行执行不同的任务部分./** * 并行执行不同的任务部分. * 1. 当一个线程在执行第一部分数据时. * 2. 第二个线程可以同时为准备执行第二部分数据做一些准备. * 3. 当第二部分数据准备完成时, 接着就可以直接执行第二部分数据, 而不需要再去准备数据. */public class CountDownLatchDemo1 { public stati...原创 2019-07-23 17:00:27 · 136 阅读 · 0 评论 -
java并发工具包-CyclicBarrier
1. 作用: 各自任务完成之后, 互相等待;所有任务完成之后, 才能继续执行./** * CyclicBarrier: * 1. 各自任务完成之后, 互相等待; * 2. 所有任务完成之后, 才能继续执行. */public class CyclicBarrierDemo1 { public static void main(String[] args) { C...原创 2019-07-23 17:01:42 · 137 阅读 · 0 评论 -
java并发工具包-Exchanger
1. 作用两个线程之间互换数据。若其中一个线程发生错误的时候,会导致另外一个线程一直等待。操作的线程必须成对出现;符合一对一的规则。传递的参数,在两个线程中,使用的是同一个对象。exchange方法可以在线程中多次使用。不断交换数据。...原创 2019-07-23 17:02:48 · 152 阅读 · 0 评论 -
java 特殊关键字作用
transient: 一个对象只要实现了Serializable接口,该对象就可以被序列化。然而在实际开发过程中,常常会遇到这样的问题,该类有些属性需要序列化,其他属性不需要被序列化。例如一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及序列化)中被传输,这些信息对应的变量就可以加上transient关键字,这样变量的生命周期仅存在于调用者的内存中而不会被...原创 2019-07-19 09:10:10 · 165 阅读 · 0 评论 -
java并发工具包-Semaphore(信号量)
1. 使用Semaphore做锁public class SemaphoreDemo1 { public static void main(String[] args) { SemaphoreLock lock = new SemaphoreLock(); IntStream.rangeClosed(0, 3).forEach(item -> {...原创 2019-07-24 10:16:13 · 207 阅读 · 0 评论 -
Thread-per-Message模式
目的:就是每来一个请求, 为这个请求创建一个线程来执行此请求。从而保证程序不会被堵塞。public class Message { private final String data; public Message(String data) { this.data = data; } public String getD...原创 2019-07-15 15:07:36 · 290 阅读 · 0 评论 -
maven实战--笔记
文章目录原创 2019-07-11 08:54:58 · 97 阅读 · 0 评论 -
Spring Boot 2.0
文章目录1. WebFlux1. WebFluxwebFlux和servlet容器相冲,而且,默认servlet容器的优先级比webflux高,所以,在pom.xml文件中,需要去除servlet容器相关的jar。然后,添加webflux的jar即可。...原创 2019-04-15 15:35:39 · 153 阅读 · 0 评论 -
Spring 实战4
文章目录1. Spring 之旅 (Spring简介以及基础知识)1. Spring 上下文(XML)2. Spring容器1. Spring 之旅 (Spring简介以及基础知识)1. Spring 上下文(XML)通过XML进行Bean配置的时候,可以通过ClassPathXmlApplicationContext加载spring的上下文。通过上下文可以获取Bean。2. Spri...原创 2019-05-10 14:18:43 · 140 阅读 · 0 评论 -
java秒杀实战
文章目录1. 分布式session2. 压测1. 分布式session使用redis作为session的存储容器。2. 压测使用JMeter进行压测,查看qps的数量。再根据服务器的top命令,查看哪些进程在消耗资源。...原创 2019-05-20 17:23:20 · 268 阅读 · 0 评论 -
JAVA常见bug
文章目录Arrays.asList()Arrays.asList()描述:此方法目的是把一个数组转换成集合。注意点:1. 由于asList产生的集合元素是直接引用作为参数的数组,所以当外部数组或集合改变时,数组和集合会同步变化。2. 由于asList产生的集合并没有重写add,remove等方法,所以它会调用父类AbstractList的方法,而父类的方法中抛出的却是异常信息。3. ...原创 2019-06-12 12:43:32 · 1499 阅读 · 0 评论 -
volatile详解
文章目录1. Wait set(wait队列)2. volatile1. Wait set(wait队列)名称解析:当对于同一个锁而言,会把所有的wait线程,加入到自己的一个wait set中。注意点:所有对象都会有一个wait set,用于存放调用了该对象的wait方法之后进入block状态的线程。线程被notify之后,不一定立即执行,需要再次去抢锁,才能获得CPU执行权。线...原创 2019-07-09 08:32:39 · 171 阅读 · 0 评论 -
多线程--Future模式
1. Future模式作用: 当任务执行时间很久,导致阻塞其它任务的执行,降低了系统的吞吐量。而Future则不阻塞任务的执行。/** * 真正任务执行接口. */public interface FutureTask<T> { T call();}/** * 作为外部得到任务执行结果的接口*/public interface Future<T>...原创 2019-07-13 13:09:43 · 238 阅读 · 0 评论 -
大型网站系统与java中间件实践笔记
文章目录大型网站系统与java中间件实践笔记 _ 曾宪杰1. 分布式系统介绍大型网站系统与java中间件实践笔记 _ 曾宪杰1. 分布式系统介绍IO区别:BIO: 阻塞IO.AIO:java7引入,在有通知时表示相关操作已经完成。NIO:在有通知时表示可以进行操作。LVS架构的优缺点:优点:...原创 2019-07-11 08:45:06 · 198 阅读 · 0 评论 -
多线程-countDownLatch模式
CountDownLatch含义:必须等待一部分任务执行完成,才能执行下面的业务。public class MyCountDownLatch { private final int total; private int count = 0; public MyCountDownLatch(int total) { this.total = tota...原创 2019-07-15 14:29:29 · 86 阅读 · 0 评论 -
java并发工具包-ReentrantLock
常用API:lock方法:是无法被打断的;只能一直waiting;lockInterruptibly:可以使用interrupt打断线程。tryLock:尝试获得锁,看是否能够获得锁。能够获得锁,就直接锁住。没有获得锁,线程直接结束,不会waiting。public class ReentrantLockDemo1 { private static final Lock ...原创 2019-07-24 13:56:47 · 139 阅读 · 0 评论 -
java并发工具包-ReadWriteLock
读写锁:对于只读的时候, 不需要加锁,但是, 只要和写混合, 或者是单纯的写都需要加锁. 防止数据的错误./** * 读写锁: * 对于只读的时候, 不需要加锁. * 但是, 只要和写混合, 或者是单纯的写都需要加锁. 防止数据的错误. */public class ReadWriteLockDemo1 { private static final ReadWriteLoc...原创 2019-07-24 14:27:10 · 110 阅读 · 0 评论 -
java并发工具包-ScheduleService
文章目录1. TimerTask:2. ScheduleService1. TimerTask:存在的缺陷:若执行的任务超时,会导致,定时只能在任务之后完成之后,才能接着执行。private static void useTimerTask() { Timer timer = new Timer(); TimerTask task = new TimerTask() { ...原创 2019-08-01 14:00:05 · 1163 阅读 · 0 评论 -
java并发工具包-CompletionService和ExecutorService痛点
文章目录1. 痛点阐述2. 解决方案.1. 痛点阐述来源:因为使用ExecutorService返回的Future,使用Future去获取任务的返回值;会导致阻塞;因此,引入CompletionService来任务执行完成一个,则返回一个结果,不会因为其中的一个任务没结束,而导致获取结果的阻塞。痛点:场景1:当执行批量任务的时候,规定了多长时间去执行任务,若任务未执行完成,则返回未执行...原创 2019-08-01 15:05:17 · 196 阅读 · 0 评论 -
java并发工具包-CompletableFuture(since jdk1.8)
文章目录1. 解决的问题2. 任务执行完成, 自动回调3. 阶段任务, 谁先执行完, 谁直接执行下一阶段任务4. CompletableFuture API1. 解决的问题为了解决使用线程池的时候,返回的Future,当去获取数据的时候,会阻塞住程序。使用CompleteableFuture则可以执行完成后再给一个执行完成的信号。2. 任务执行完成, 自动回调private stati...原创 2019-08-08 09:52:56 · 501 阅读 · 0 评论 -
多线程-阻塞队列
文章目录1. BlockingQueue2. java中的阻塞队列1. BlockingQueue是一个支持两个附加操作的队列。这两个附加操作就是支持阻塞的插入和移除操作。常用语生产者-消费者模式中。若是无界阻塞队列,队列不可能出现满的情况,所有使用put和offer的时候永远不会被阻塞。2. java中的阻塞队列ArrayBlockingQueue:是一个数组实现的有界阻塞队列。按...原创 2019-08-13 15:46:05 · 144 阅读 · 0 评论 -
项目中的问题-controller是否线程安全
结论:Controller是线程不安全的, 默认的controller是单列的; 因此所有的线程共享一个controller;可以通过设置controller的scope来改变,使得每个线程拥有自己的controller实例。测试:/** * Controller是线程不安全的, 默认的controller是单列的; 因此所有的线程共享一个controller; * result: ...原创 2019-08-14 10:16:36 · 3941 阅读 · 0 评论 -
多线程-安全集合
文章目录1. ConcurrentSkipListMap2. ConcurrentLinkedQueue2. CopyOnWriteArrayList & CopyOnWriteArraySet1. ConcurrentSkipListMap概述:底层使用跳表来快速操作元素;利于查询。API使用public class ConcurrentSkipListMapTest { ...原创 2019-08-14 18:27:54 · 181 阅读 · 0 评论 -
项目中遇到的问题-Spring Boot + Mybatis plus, 事务不生效
文章目录1. Spring Boot + Mybatis plus, 事务不生效。1. Spring Boot + Mybatis plus, 事务不生效。问题重现:@Autowiredprivate DeviceTypeServiceImpl deviceTypeService;@Override@Transactional(rollbackFor = Exception.cl...原创 2019-08-12 15:16:50 · 13703 阅读 · 24 评论 -
FASTDFS单节点安装,详细介绍
需要开启的端口:Storage.conf中配置的server port: 23000; 一、准备工作(Tacker和Storage都需要安装): 1.FastDFS安装包。 2.安装gcc: yum install make cmake gcc gcc-c++ 二、安装libfastcommon(Tacker和Storage都需要安装):libfastcomm...原创 2018-09-27 20:17:01 · 198 阅读 · 1 评论 -
java并发工具包-Phaser(since jdk1.7)
文章目录1. Pasher基础知识1. 使用Phaser模仿CountDownLatch操作.2. 使用Phaser模仿CyclicBarrier操作.1. Pasher基础知识1. 使用Phaser模仿CountDownLatch操作./** * 模仿使用CountDownLatch. */public class PhaserDemo1 { private static f...原创 2019-07-27 15:51:38 · 253 阅读 · 0 评论 -
多线程-优雅的关闭线程
直接上代码/** * 优雅的关闭线程. */public class ShutDown { public static void main(String[] args) throws InterruptedException { Runner one = new Runner(); Thread countThread = new Thread(on...原创 2019-08-05 09:01:04 · 302 阅读 · 0 评论 -
java并发工具包-Executors
文章目录1. ThreadPoolExecutor参数2. newCachedThreadPool3. newFixedThreadPool4. newSingleThreadPool5. newWorkStealingPool(since jdk1.8)1. ThreadPoolExecutor参数当taskCount > MaximumPoolSize的时候,才会active升级为...原创 2019-07-29 14:44:19 · 468 阅读 · 0 评论 -
java并发工具包-Condition
1. 使用condition做生产者-消费者模式Condition和Lock搭配使用; condition必须使用lock.newCondition();来创建condition。和wait;notify相似;所需要的要求也一样,必须存放在Lock中。否则抛出异常。/** * 使用Condition做生产者-消费者模式. */public class ConditionDemo {...原创 2019-07-25 11:25:01 · 147 阅读 · 0 评论 -
java并发工具包-StampedLock(since jdk1.8)
1. ReentrantLock VS SynchronizedReentrantLock 提供了较多的API,可以灵活的在线程中获取到锁的一些数据;而Synchronized则无法获得锁的数据。ReentrantLock 可以更加细粒度的控制线程代码块。ReentrantLock 相对于Synchronized性能更高效一些。2. ReentrantReadWriteLock对于...原创 2019-07-25 14:43:06 · 374 阅读 · 0 评论 -
java并发工具包-ForkJoin
1. RecursiveTask: 有返回值的ForkJoin;需要估算多大的“划分值”合适。否则,可能导致花费的时间和资源较大。public class ForkJoinRecursiveTask { private static final int MAX_THREAD_HOLED = 200; public static void main(String[] args)...原创 2019-07-25 15:40:41 · 124 阅读 · 0 评论 -
java并发工具包-ExecutorService
文章目录1. 拒绝策略2. ExecutorService API1. 拒绝策略AbortPolicy: 当提交的任务超过了线程池的任务队列大小;则会直接抛出异常,拒绝接收此任务;其它的任务依然执行。DiscardPolicy:当提交的任务超过了线程池的任务队列大小;不会产生任何现象,线程池会直接丢弃此任务;不建议使用。CallerRunPolicy:不会提交给线程池执行任务,而是,直接...原创 2019-07-31 11:06:55 · 227 阅读 · 0 评论 -
多线程-原子包(Atomic*)以及CAS
文章目录1. AtomicInteger1. AtomicInteger使用的就是CAS(compareAndSet)算法;不加锁,只是通过CAS算法保证操作的可靠性,正确性。不断尝试修改值,保证了结果的最终一致性。...原创 2019-07-22 15:39:22 · 295 阅读 · 0 评论 -
java并发工具包-Future
文章目录1. Future API2. Future缺陷以及解决方案1. Future APIget():此方法是阻塞的;使用interrupt的时候,打断的是当前线程,让当前线程不再阻塞的等待获取数据;并不是打断线程池中的线程;get(TimeOut):若是获取数据超时了,但是任务还是依旧执行,只是不再等待任务的返回值;cancel(mayInterruptIfRunning):取消任...原创 2019-07-31 16:07:50 · 190 阅读 · 0 评论 -
多线程-自定义线程池
Take is cheap, Show me the code./** * 自定义线程池技术案列 */public class ThreadPoolDemo { public static void main(String[] args) { ThreadPool<Job> threadPool = new DefaultThreadPoolDemo&l...原创 2019-08-05 10:47:05 · 202 阅读 · 0 评论 -
Spring mvc 使用tomcat plug
编辑器的是idea,所以在Springmvc项目中,测试时,都需要不断去发布,比较麻烦,可以使用maven 的tomcat plug使用流程:1. 在maven插件中进行 clean package.2. 在tomcat plug中, 点击exec-war-only1. pom.xml文件: 主要引入webmvc, servletjar, 以及tomcat plug, 使用tomcat p...原创 2019-04-16 13:57:47 · 710 阅读 · 0 评论