CountDownLatchJavapublicclassJoinCountDownLatchTest{publicstaticvoidmain(String[]args)throwsInterruptedException{Threadparser1newThread(newRunnable(){Overridepublicvoidrun(){System.out.println("parser1finish");}});Threadparser2newThread(newRunnable(){Overridepublicvoidrun(){System.out.println("parser2finish");}});parser1.start();parser2.start();parser1.join();parser2.join();System.out.println("...
2022-10-30 23:14:48 2713浏览 0点赞 0回复 0收藏
Java中的13个原子操作类Atomic包里一共提供了13个类,属于4种类型的原子更新方式,分别是原子更新基本类型、原子更新数组、原子更新引用和原子更新属性(字段)。Atomic包里的类基本都是使用Unsafe实现的包装类。原子更新基本类型类AtomicBoolean:原子更新布尔类型。AtomicInteger:原子更新整型。AtomicLong:原子更新长整型。javaimportjava.util.concurrent.atomic.AtomicInteger;publicclassAtomicIntegerTest{staticAtomi...
2022-10-30 23:13:34 3286浏览 0点赞 0回复 0收藏
ForkJoin框架ForkJoin框架是Java7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架。javapackagecom.example.xppdemo.chapter6;importjava.util.concurrent.ExecutionException;importjava.util.concurrent.ForkJoinPool;importjava.util.concurrent.Future;importjava.util.concurrent.RecursiveTask;publicclassCountTaskextendsRecursiveTask{privatesta...
2022-10-30 23:12:22 2804浏览 0点赞 0回复 0收藏
阻塞队列实现原理如果队列是空的,消费者会一直等待,当生产者添加元素时,消费者是如何知道当前队列有元素的呢?如果让你来设计阻塞队列你会如何设计,如何让生产者和消费者进行高效率的通信呢?让我们先来看看JDK是如何实现的。使用通知模式实现。所谓通知模式,就是当生产者往满的队列里添加元素时会阻塞住生产者,当消费者消费了一个队列中的元素后,会通知生产者当前队列可用。通过查看JDK源码发现ArrayBlockingQueue使用...
2022-10-30 23:11:06 2713浏览 0点赞 0回复 0收藏
Java中的阻塞队列阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作支持阻塞的插入和移除方法。1)支持阻塞的插入方法:意思是当队列满时,队列会阻塞插入元素的线程,直到队列不满。2)支持阻塞的移除方法:意思是在队列为空时,获取元素的线程会等待队列变为非空。阻塞队列常用于生产者和消费者的场景,生产者是向队列里添加元素的线程,消费者是从队列里取元素的线程。阻塞队列就是生产者用来存放元...
2022-10-30 23:09:20 3830浏览 0点赞 0回复 0收藏
ConcurrentLinkedQueueConcurrentLinkedQueue是一个基于链接节点的无界线程安全队列,它采用先进先出的规则对节点进行排序,当我们添加一个元素的时候,它会添加到队列的尾部;当我们获取一个元素时,它会返回队列头部的元素。ConcurrentLinkedQueue由head节点和tail节点组成,每个节点(Node)由节点元素(item)和指向下一个节点(next)的引用组成,节点与节点之间就是通过这个next关联起来,从而组成一张链表结构的队列。默...
2022-10-30 23:08:10 3125浏览 0点赞 0回复 0收藏
ConcurrentHashMap为什么要用ConcurrentHashMap(1)线程不安全的HashMap在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。HashMap在并发执行put操作时会引起死循环,是因为多线程会导致HashMap的Entry链表形成环形数据结构,一旦形成环形数据结构,Entry的next节点永远不为空,就会产生死循环获取Entry。(2)效率低下的HashTableHashTable容器使用synchronized...
2022-10-30 23:04:01 2789浏览 1点赞 0回复 0收藏
LockSupport与ConditionLockSupportpark开头的方法用来阻塞当前线程unpark(Threadthread)方法来唤醒一个被阻塞的线程Condition一般都会将Condition对象作为成员变量。当调用await()方法后,当前线程会释放锁并在此等待,而其他线程调用Condition对象的signal()方法,通知当前线程后,当前线程才从await()方法返回,并且在返回前已经获取了锁。javapublicclassConditionUseCase{LocklocknewReentrantLock();Conditionconditionlo...
2022-10-30 23:02:56 1935浏览 0点赞 0回复 0收藏
重入锁重进入是指任意线程在获取到锁之后能够再次获取该锁而不会被锁所阻塞,该特性的实现需要解决以下两个问题。1)线程再次获取锁。锁需要去识别获取锁的线程是否为当前占据锁的线程,如果是,则再次成功获取。2)锁的最终释放。线程重复n次获取了锁,随后在第n次释放该锁后,其他线程能够获取到该锁。锁的最终释放要求锁对于获取进行计数自增,计数表示当前锁被重复获取的次数,而锁被释放时,计数自减,当计数等于0时表示锁...
2022-10-30 23:01:13 3019浏览 0点赞 0回复 0收藏
队列同步器AQS同步器的设计是基于模板方法模式的,重写同步器指定的方法时,需要使用同步器提供的如下3个方法来访问或修改同步状态。getState():获取当前同步状态。setState(intnewState):设置当前同步状态。compareAndSetState(intexpect,intupdate):使用CAS设置当前状态,该方法能够保证状态设置的原子性。同步器依赖内部的同步队列(一个FIFO双向队列)来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前...
2022-10-30 22:59:43 2752浏览 0点赞 0回复 0收藏
线程通信volatile和synchronized关键字任意线程对Object(Object由synchronized保护)的访问,首先要获得Object的监视器。如果获取失败,线程进入同步队列,线程状态变为BLOCKED。当访问Object的前驱(获得了锁的线程)释放了锁,则该释放操作唤醒阻塞在同步队列中的线程,使其重新尝试对监视器的获取。等待通知机制notify():通知一个在对象上等待的线程,使其从wait()方法返回,而返回的前提是该线程获取到了对象的锁notifyAll(...
2022-10-30 22:57:32 3181浏览 0点赞 0回复 0收藏
线程简介六种线程状态NEW:初始状态,线程被构建,但是还没有调用start方法RUNNABLE:运行状态,Jaⅵa线程将操作系统中的就绪和运行两种状态笼统地称作“运行中BLOCKED:阻塞状态,表示线程阻塞于锁WAITING:等待状态,表示线程进入等待状态,进入该状态表示当前线程需要等待其他线程做出一些特定动作(通知或中断)TIMEWAITING:超时等待状态,该状态不同于WAITING,它是可以在指定的时间自行返回的TERMINATED:终止状态,表示当前线程已...
2022-10-30 22:55:52 2620浏览 0点赞 0回复 0收藏
java内存模型之双重检查锁定与线程安全的延迟初始化双重检查锁定javapublicclassUnsafeLazyInitialization{privatestaticInstanceinstance;publicstaticInstancegetInstance(){if(instancenull)1:A线程执行instancenewInstance();2:B线程执行returninstance;}}javapublicclassSafeLazyInitialization{privatestaticInstanceinstance;publicsynchronizedstaticInstancegetInstance(){if(instancenull)instancenewInstance();re...
2022-10-30 22:52:14 2394浏览 0点赞 0回复 0收藏
java内存模型之happenbefore原则JMM其实是在遵循一个基本原则:只要不改变程序的执行结果(指的是单线程程序和正确同步的多线程程序),编译器和处理器怎么优化都行。happensbefore关系的定义happensbefore关系的定义如下。1)如果一个操作happensbefore另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。2)两个操作之间存在happensbefore关系,并不意味着Java平台的具体...
2022-10-30 22:45:26 2625浏览 0点赞 0回复 0收藏
java内存模型之重排序happensbefore在JMM中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须要存在happensbefore关系。这里提到的两个操作既可以是在一个线程之内,也可以是在不同线程之间。程序顺序规则:一个线程中的每个操作,happensbefore于该线程中的任意后续操作。监视器锁规则:对一个锁的解锁,happensbefore于随后对这个锁的加锁。volatile变量规则:对一个volatile域的写,happensbefore于任...
2022-10-30 22:44:00 3133浏览 0点赞 0回复 0收藏
Java并发机制的底层实现原理Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行,Java中所使用的并发机制依赖于JVM的实现和CPU的指令。2.1volatile的应用在多线程并发编程中synchronized和volatile都扮演着重要的角色,volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个...
2022-10-30 22:42:27 2652浏览 0点赞 0回复 0收藏
SpringSecurity认证流程分析AuthenticationManagerAuthenticationManager是认证管理器它定义了SpringSecurity过滤器要如何执行认证操作。AuthenticationManager在认证后会返回一个Authentication对象,它是一个接口,默认实现类是ProviderManagerAuthenticationProviderAuthenticationProvider针对不同的身份类型执行具体的身份认证。DaoAuthenticationProvider用来支持用户名密码登录认证RememberMeAuthenticationProvider用来...
2022-10-30 22:40:41 3419浏览 0点赞 0回复 0收藏
springsecurity之登录用户数据的获取从当前请求对象中获取用户信息SpringMVC中Controller的请求参数都是当前请求HttpServletRequest带来的,AuthenticationPrincipal也是HttpServletRequest带来的,在Controller层我们拿到的是HttpServletRequest的实例是Servlet3SecurityContextHolderAwareRequestWrapperServlet3SecurityContextHolderAwareRequestWrapperServlet3SecurityContextHolderAwareRequestWrapper继承SecurityConte...
2022-10-30 22:36:32 4385浏览 0点赞 0回复 0收藏
SecurityContextPersistenceFilterSecurityContextPersistenceFilter是Springsecurity链中第二道防线,位于WebAsyncManagerIntegrationFilter之后,作用是为了存储SecurityContext而设计的。SecurityContextPersistenceFilter主要做两件事:1.当请求到来时,从HttpSession中获取SecurityContext并存入SecurityContextHolder中,这样在同一个请求的后续处理过程中,通过SecurityContextHolder获取数据2.当一个请求处理完毕时,从...
2022-10-30 22:34:27 3696浏览 0点赞 0回复 0收藏
传统应用如何Serverless化坚持原创,写好每一篇文章我们知道了Serverless有很多优点,如何真正用起来Serverless,如何把传统的应用程序过渡到Serverless呢?我们需要知道传统应用和Serverless应用之间有哪些差距身份认证在进行身份认证的时候,传统应用有基于Session的存储和jwt两种方式,而Serverless只支持一种方式。是基于jwt的,因为jwt是无状态的。Session的方式需要保存到内存中,而Serverless的内存是比较短暂的,这种基...
2022-10-30 17:42:15 3295浏览 0点赞 0回复 0收藏