![](https://img-blog.csdnimg.cn/20201014180756930.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JAVA
文章平均质量分 81
灵药哟丶
这个作者很懒,什么都没留下…
展开
-
Java锁的正确使用
使用JVM锁只对某个用户锁原创 2022-09-22 09:50:09 · 646 阅读 · 2 评论 -
深入理解ReentrantReadWriteLock
ReentrantReadWriteLock是读写锁的实现,写锁基于AQS的独占模式,读锁基于AQS的共享模式,读锁和写锁默认采用非公平锁,是一种可重入锁。可以在构造方法中指定是公平锁还是非公平锁ReentrantLock是排他锁,排他锁在同一时刻仅有一个线程可以进行访问,实际上独占锁是一种相对比较保守的锁策略,独占锁模式下的读/读、读/写、写/写操作都不能同时发生,这在一定程度上降低了吞吐量。然而读操作之间不存在数据竞争问题,如果读/读操作能够以共享锁的方式进行,那会进一步提升性能。为了解决读写冲原创 2020-08-15 13:42:43 · 326 阅读 · 0 评论 -
深入理解Semaphore
Semaphore是基于AQS共享锁来实现,默认采用非公平锁。Semaphore 类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。Semaphore用于限制可以访问某些资源(物理或逻辑的)的线程数目,其维护了一个许可证集合,有多少资源限制就维护多少许可证集合,假如这里有N个资源,那就对应于N个许可证,同一时刻也只能有N个线程访问。一个线程获取许可证就调用acquire方法,用完了释放资源就调用release方法。可以在构造方法中指定是公平锁还是非公平锁使用案例下面使用Semaphore进原创 2020-08-15 13:41:45 · 302 阅读 · 0 评论 -
深入理解CyclicBarrier
CyclicBarrier基于AQS的Condition来实现。相比CountDownLatch,CyclicBarrier 可以有不止一个栅栏,因为它的栅栏(Barrier)可以重复使用(Cyclic)。CyclicBarrier允许一组线程在到达某个栅栏点(common barrier point)互相等待,直到最后一个线程到达栅栏点,栅栏才会打开,处于阻塞状态的线程恢复继续执行。使用案例注意下面的CyclicBarrier可以循环使用@org.junit.jupiter.api.Test原创 2020-08-15 13:40:38 · 247 阅读 · 0 评论 -
深入理解CountDownLatch
CountDownLatch基于AQS的共享模式,用来控制一个或者多个线程等待多个线程。CountDownLatch使用一个计数器进行实现。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。使用案例@org.junit.jupiter.api.Testvoid testCountDownLatch() { int nCpu = 4, queueCapacity =原创 2020-08-15 13:40:07 · 234 阅读 · 0 评论 -
深入理解ReentrantLock
ReentrantLock基于AQS的独占模式,默认采用非公平锁,是一种可重入锁。可以在构造方法中指定是公平锁还是非公平锁使用案例ArrayBlockingQueue中的代码:final ReentrantLock lock;private final Condition notFull;public void put(E e) throws InterruptedException { checkNotNull(e); final ReentrantLock lock = t原创 2020-08-15 13:39:39 · 161 阅读 · 0 评论 -
深入理解AQS
所谓AQS,指的是AbstractQueuedSynchronizer,它提供了一种实现阻塞锁和一系列依赖FIFO等待队列的同步器的框架,ReentrantLock、Semaphore、CountDownLatch、CyclicBarrier等并发类均是基于AQS来实现的,具体用法是通过继承AQS实现其模板方法,然后将子类作为同步组件的内部类。基本原理AQS 核心思想:如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并且将共享资源设置为锁定状态。如果被请求的共享资源被占用,那么就原创 2020-08-15 13:38:55 · 771 阅读 · 1 评论 -
数据库和缓存双写问题
数据库和缓存双写问题缓存的目的是为了减少数据库的压力,但只要用了缓存,就肯定会有不一致,2个数据源之间是没有事务的,没法保证绝对的强一致。从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。常见的四种方案:先更新缓存,在更新数据库先更新数据库,再更新缓存先删除缓存,再更新数据库先更新数据库,再删除缓存微软和Facebook采用的更新策略是第四种:cache-asideScaling Memcache at Facebook先更新缓存,在更新数据库问题:如果更新缓存后,原创 2020-08-08 15:11:53 · 674 阅读 · 1 评论 -
java集合-Queue-Deque篇
java集合-Queue/Deque篇JDK提供的集合类型主要分为四种类型:List:支持重复元素Set:不支持重复元素Map:键/值对的映射集Queue/Deque(double ended queue):queue是在集合尾部添加元素,在头部删除元素的队列,deque是可在头部和尾部添加或者删除元素的双端队列,deque既可以实现队列又可以实现栈。本文基于JDK8,java version “1.8.0_251”ArrayDeque基于数组,循环数组,非线程安全,效率高,双端队列,原创 2020-08-08 15:10:08 · 717 阅读 · 0 评论 -
java集合-Map篇
java集合-Map篇JDK提供的集合类型主要分为四种类型:List:支持重复元素Set:不支持重复元素Map:键/值对的映射集Queue/Deque(double ended queue):queue是在集合尾部添加元素,在头部删除元素的队列,deque是可在头部和尾部添加或者删除元素的双端队列,deque既可以实现队列又可以实现栈。本文基于JDK8,java version “1.8.0_251”HashMap数组+链表/红黑树,非线程安全在JDK8之前,hashMap是数组原创 2020-08-08 15:07:14 · 182 阅读 · 0 评论 -
java集合-Set篇
java集合-Set篇JDK提供的集合类型主要分为四种类型:List:支持重复元素Set:不支持重复元素Map:键/值对的映射集Queue/Deque(double ended queue):queue是在集合尾部添加元素,在头部删除元素的队列,deque是可在头部和尾部添加或者删除元素的双端队列,deque既可以实现队列又可以实现栈。本文基于JDK8,java version “1.8.0_251”EnumSet(RegularEnumSet/JumboEnumSet)枚举类的容器,原创 2020-08-08 15:05:44 · 221 阅读 · 0 评论 -
java集合-List篇
java集合-List篇JDK提供的集合类型主要分为四种类型:List:支持重复元素Set:不支持重复元素Map:键/值对的映射集Queue/Deque(double ended queue):queue是在集合尾部添加元素,在头部删除元素的队列,deque是可在头部和尾部添加或者删除元素的双端队列,deque既可以实现队列又可以实现栈。本文基于JDK8,java version “1.8.0_251”ArrayList基于数组,支持随机访问,非线程安全实现了RandomAcce原创 2020-08-08 15:03:30 · 137 阅读 · 0 评论 -
GitHub如何上传本地源代码
关于如何上传本地源代码...方法不一,这里只介绍本人所采用的方法。前提条件:你需要拥有一个GitHub账号,如果没有的话,先去创建一个, 网址: www.github.com然后下载安装git 网址:https://desktop.github.com/创建成功之后,先在github上创建一个repositories(点开在头像下的your profile---->repositories-...原创 2018-04-10 15:52:58 · 588 阅读 · 0 评论 -
RedisDesktopManager连接远程Redis详细教程
RedisDesktopManager连接远程Redis详细教程原创 2018-05-03 16:46:26 · 8757 阅读 · 2 评论 -
JAVA发送HTTP请求方式总结
java 发送HTTP请求方式总结源代码:http://github.com/lovewenyo/HttpDemo1. HttpURLConnection使用JDK原生提供的net,无需其他jar包; HttpURLConnection是URLConnection的子类,提供更多的方法,使用更方便。package httpURLConnection;import...原创 2018-05-30 14:40:21 · 60295 阅读 · 6 评论 -
Java常用加密技术和代码总结
首先大家要记住现代密码学最重要的原则柯克霍夫原则: 数据的安全基于密钥而不是算法的保密。也就是说即使密码系统的任何细节已为人悉知,只要密匙未洩漏,它也应是安全的。具体来说: 系统必须可用,非数学上不可译码。 系统不一定要保密,可以轻易落入敌人手中。 密匙必须可以不经书写的资料交换和记忆,且双方可以改变密匙。 系统可以用于电讯。 系统可以转移位置,它的功能必须不用经过几个人之手才可达到。 系统容易使...转载 2018-04-13 08:46:36 · 234 阅读 · 0 评论 -
java.sql.Date java.util.Date String 的相互转换
import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.Date;/** * java.util.Date * 1、就是在除了SQL语句的情况下面使用;是 java.sql.Date 的父类; * 2、是常用的表示时间的类,我们通常格式化或者得到当前时间都是用它。 * ...原创 2017-11-24 15:50:15 · 1632 阅读 · 2 评论