java 并发
文章平均质量分 52
qq_489366879
这个作者很懒,什么都没留下…
展开
-
Canal原理及在缓存上的使用
1 什么是canal canal是用java开发的基于数据库增量日志解析,提供增量数据订阅&消费的中间件。目前,canal主要支持了MySQL的binlog解析,解析完成后才利用canal client 用来处理获得的相关数据。(数据库同步需要阿里的otter中间件,基于canal)2 canal使用场景-更新缓存 如果有大量的请求发送到mysql的话,mysql查询速度慢,QPS上不去,光查mysql可能会瘫痪,那就可以在前面加个缓存,这个缓存有2个主要的问题...原创 2021-11-18 16:55:15 · 1092 阅读 · 0 评论 -
Netty-源码分析ByteBuf-readSlice和readRetainedSlice使用细节
readSlice返回从当前readerIndex开始的此缓冲区的子区域的新分片,并将readerIndex增加新分片的大小(=长度)。另请注意,此方法将不会调用retain(),因此不会增加引用计数。跟slice极为相似,只是把原始缓冲区的readerIndex进行了增加@Overridepublic ByteBuf readSlice(int length) { checkReadableBytes(length); ByteBuf slice = sl原创 2021-08-10 11:01:38 · 1226 阅读 · 0 评论 -
Java-阻塞队列(BlockingQueue)
1.阻塞队列(BlockingQueue)BlockingQueue 继承了 Queue 接口,是队列的一种。Queue 和 BlockingQueue 都是在 Java 5 中加入的。java.util.concurrent.BlockingQueuepublic interface BlockingQueue<E> extends Queue<E> {...}BlockingQueue 有 6 种最主要的实现如下ArrayBlockingQueueLink原创 2021-07-09 11:40:35 · 542 阅读 · 2 评论 -
Java--ReentrantReadWriteLock
概述 ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时ReentrantReadWriteLock能够提供比排他锁更好的并发性和吞吐量。 读写锁内部维护了两个锁,一个用原创 2021-07-05 19:41:28 · 85 阅读 · 0 评论 -
Java-CyclicBarrier(循环栅栏)
1. CyclicBarrier 是什么?从字面上的意思可以知道,这个类的中文意思是“循环栅栏”。大概的意思就是一个可循环利用的屏障。它的作用就是会让所有线程都等待完成后才会继续下一步行动。举个例子,就像生活中我们会约朋友们到某个餐厅一起吃饭,有些朋友可能会早到,有些朋友可能会晚到,但是这个餐厅规定必须等到所有人到齐之后才会让我们进去。这里的朋友们就是各个线程,餐厅就是 CyclicBarrier。2. 怎么使用 CyclicBarrier2.1 构造方法public Cyclic原创 2021-07-05 18:21:08 · 124 阅读 · 0 评论 -
Java-countDownLatch
1.背景:countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。 存在于java.util.cucurrent包下。2.概念countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。 是通过一个计数器来实现的,计数器的初始值是线程的数量。每当一个线程执行完毕后,计数器的值就-1,当计数器的值为0时,表示所有线程都执行完毕,然后在闭锁上等待原创 2021-07-05 17:17:07 · 71 阅读 · 0 评论 -
Java-Semaphore(信号量)
Semaphore(信号量):是一种计数器,用来保护一个或者多个共享资源的访问。如果线程要访问一个资源就必须先获得信号量。如果信号量内部计数器大于0,信号量减1,然后允许共享这个资源;否则,如果信号量的计数器等于0,信号量将会把线程置入休眠直至计数器大于0.当信号量使用完时,必须释放。实例代码: final Semaphore semaphore = new Semaphore(2); ExecutorService executorService = Executors...原创 2021-07-05 16:48:50 · 87 阅读 · 0 评论 -
Java-CLH锁
锁值:我把自旋条件定义为锁值 locked。locked == true 表示节点的处于加锁状态或者等待加锁状态,locked == false 表示节点处于解锁状态。原创 2021-07-02 16:44:24 · 149 阅读 · 0 评论 -
Java - ThreadLocal
多线程访问同一个共享变量的时候容易出现并发问题,特别是多个线程对一个变量进行写入的时候,为了保证线程安全,一般使用者在访问共享变量的时候需要进行额外的同步措施才能保证线程安全性。ThreadLocal是除了加锁这种同步方式之外的一种保证一种规避多线程访问出现线程不安全的方法,当我们在创建一个变量后,如果每个线程对其进行访问的时候访问的都是线程自己的变量这样就不会存在线程不安全问题。 ThreadLocal是JDK包提供的,它提供线程本地变量,如果创建一乐ThreadLocal变量,那么访问这个变量的每原创 2021-06-16 11:41:46 · 109 阅读 · 0 评论 -
Java-自旋锁
自旋锁(spinlock):是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。获取锁的线程一直处于活跃状态,但是并没有执行任何有效的任务,使用这种锁会造成busy-waiting。Java如何实现自旋锁?下面是个简单的例子:...原创 2021-06-15 18:58:34 · 124 阅读 · 0 评论 -
Java-CompareAndSet(CAS)
先要说一下,AtomicInteger类compareAndSet通过原子操作实现了CAS操作,最底层基于汇编语言实现。简单说一下原子操作的概念,“原子”代表最小的单位,所以原子操作可以看做最小的执行单位,该操作在执行完毕前不会被任何其他任务或事件打断。CAS是Compare And Set的一个简称,如下理解:1,已知当前内存里面的值current和预期要修改成的值new传入2,内存中AtomicInteger对象地址对应的真实值(因为有可能别修改)real与current对比,...原创 2021-06-15 17:09:48 · 1346 阅读 · 1 评论 -
Java-Thread.Sleep(0)作用
Thread.Sleep(0)的作用,就是“触发操作系统立刻重新进行一次CPU竞争”。竞争的结果也许是当前线程仍然获得CPU控制权,也许会换成别的线程获得CPU控制权。这也是我们在大循环里面经常会写一句Thread.Sleep(0) ,因为这样就给了其他线程比如Paint线程获得CPU控制权的权力,这样界面就不会假死在那里。...原创 2021-06-11 13:44:53 · 379 阅读 · 0 评论 -
Java-异步 I/O (AIO)
AIONIO2.0引入了新的异步通道概念,并提供了异步文件通道和异步套接字通道的实现。异步通道提供两种方式获取操作结果.通过java.util.concurrent.Future类來表示异步操作的结果;在执行异步操作的时候传入一个java.nio.channels。CompletionHandler接口的实现类作为操作完成的回调。NIO2.0的异步套接字通道是真正的异步非阻塞I/O,它对应UNIX网络编程中的事件驱动I/O (AIO),它不需要通过多路复用器(Selector)对注册的通道进..原创 2021-06-09 14:34:31 · 406 阅读 · 0 评论 -
Java - I/O 多路复用(NIO)
NIONIO,有人解释为new I/O,有人解释为Non-block I/O(我更倾向后者)。正是由于Java传统BIO的拙劣表现,才使得Java支持非阻塞I/O的呼声日渐高涨,最终,JDK1.4版本提供了新的NIO类库,Java终于也可以支持非阻塞I/O 了。NIO主要的类和接口如下:进行异步I/O操作的缓冲区ByteBuffer等; 进行异步I/O操作的管道Pipe; 进行各种I/O操作(异步或者同步)的Channel,包括ServerSocketChannel和SocketChanne原创 2021-06-09 13:32:46 · 666 阅读 · 5 评论 -
Java - 伪异步I/O编程
伪异步I/O编程为了解决同步阻塞I/O面临的一个链路需要一个线程处理的问题,后来有人对它的线程模型进行了优化,后端通过一个线程池来处理多个客户端的请求接入,形成客户端个数M:线程池最大线程数N的比例关系,其中M可以远远大于N,通过线程池可以灵活的调配线程资源, 设置线程的最大值, 防止由于海量并发接入导致线程耗尽。...原创 2021-06-09 10:20:23 · 145 阅读 · 0 评论 -
Java - 同步阻塞模式(BIO)
BIO在JDK1.4之前,基于Java的所有Socket通信都采用同步阻塞模式(BIO),这种一请求一应答的通信模型简化了上层的应用开发,但是在性能和可靠性方面却存在着巨大的瓶颈。当并发量增大,响应时间延迟增大之后,采用Java BIO开发的服务端只有通过硬件的不断扩容来满足高并发和低延迟,它极大的增加了企业的成本,随着集群规模的不断膨胀,系统的可维护性也面临巨大的挑战。...原创 2021-06-09 10:14:21 · 240 阅读 · 0 评论 -
Java并发编程:Callable、Future和FutureTask
Java并发编程:Callable、Future和FutureTask 在前面的文章中我们讲述了创建线程的2种方式,一种是直接继承Thread,另外一种就是实现Runnable接口。 这2种方式都有一个缺陷就是:在执行完任务之后无法获取执行结果。 如果需要获取执行结果,就必须通过共享变量或者使用线程通信的方式来达到效果,这样使用起来就比较麻烦。 而自从Java 1.5开始,就提供了Call...转载 2018-06-11 17:06:35 · 90 阅读 · 0 评论 -
java并发-原子性
原子性就是指该操作是不可再分的。java.util.concurrent.atomic中有一组使用无锁算法实现的原子操作类。AtomicInteger、AtomicBoolean、AtomicLong 外还有AtomicReference 。它们分别封装了对整数、整数数组、长整型、长整型数组和普通对象的多线程安全操作。这些都是居于CAS算法实现的。CAS即:Compare and Swap,是比较...转载 2018-06-06 15:30:50 · 133 阅读 · 0 评论 -
Servlet的多线程和线程安全
线程安全首先说明一下对线程安全的讨论,哪种情况我们可以称作线程安全?网上对线程安全有很多描述,我比较喜欢《Java并发编程实战》给出的定义,“当多个线程访问某个类时,不管运行时环境采用何种调度方式,或者这些线程将如何交替执行,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的”。Servlet的调用过程和生命周期Servlet的生命周期Servlet...转载 2018-06-06 16:30:40 · 201 阅读 · 0 评论 -
Java并发-原子操作类
原子操作类简介当更新一个变量的时候,多出现数据争用的时候可能出现所意想不到的情况。这时的一般策略是使用synchronized解决,因为synchronized能够保证多个线程不会同时更新该变量。然而,从jdk 5之后,提供了粒度更细、量级更轻,并且在多核处理器具有高性能的原子操作类。因为原子操作类把竞争的范围缩小到单个变量上,这可以算是粒度最细的情况了。原子操作类相当于泛化的volatile变量...转载 2018-06-07 09:35:43 · 125 阅读 · 0 评论 -
Callable,Runnable的区别及用法
编写多线程程序一般有三种方法,Thread,Runnable,Callable.Runnable和Callable的区别是:(1)Callable规定的方法是call(),Runnable规定的方法是run()。其中Runnable可以提交给Thread来包装下,直接启动一个线程来执行,而Callable则一般都是提交给ExecuteService来执行。 (2)Callable的任务执行后可返回...转载 2018-06-07 10:02:40 · 1206 阅读 · 0 评论 -
Java并发编程:阻塞队列
Java并发编程:阻塞队列 在前面几篇文章中,我们讨论了同步容器(Hashtable、Vector),也讨论了并发容器(ConcurrentHashMap、CopyOnWriteArrayList),这些工具都为我们编写多线程程序提供了很大的方便。今天我们来讨论另外一类容器:阻塞队列。 在前面我们接触的队列都是非阻塞队列,比如PriorityQueue、LinkedList(LinkedLis...转载 2018-06-14 11:08:00 · 108 阅读 · 0 评论 -
java 并发编程:ReenTrantLock可重入锁(和synchronized的区别)总结
可重入性:从名字上理解,ReenTrantLock的字面意思就是再进入的锁,其实synchronized关键字所使用的锁也是可重入的,两者关于这个的区别不大。两者都是同一个线程没进入一次,锁的计数器都自增1,所以要等到锁的计数器下降为0时才能释放锁。 锁的实现:Synchronized是依赖于JVM实现的,而ReenTrantLock是JDK实现的,有什么区别,说白了就类似于操作系统来控制实现和用...转载 2018-06-14 14:22:31 · 153 阅读 · 0 评论 -
Java并发编程--ReentrantReadWriteLock
概述 ReentrantReadWriteLock是Lock的另一种实现方式,我们已经知道了ReentrantLock是一个排他锁,同一时间只允许一个线程访问,而ReentrantReadWriteLock允许多个读线程同时访问,但不允许写线程和读线程、写线程和写线程同时访问。相对于排他锁,提高了并发性。在实际应用中,大部分情况下对共享数据(如缓存)的访问都是读操作远多于写操作,这时Reentr...转载 2018-06-08 10:46:05 · 93 阅读 · 0 评论 -
搭建 nginx+tomcat+Java的负载均衡环境
Nginx可以通过以下两种方式来实现与Tomcat的耦合:将静态页面请求交给Nginx,动态请求交给后端Tomcat处理。将所有请求都交给后端的Tomcat服务器处理,同时利用Nginx自身的负载均衡功能进行多台Tomcat服务器的负载均衡。下面通过两个配置实例分别讲述这两种实现一、动态页面和静态页面分离的实例这里假定Tomcat服务器的IP地址为192.168.12.130,...转载 2018-10-29 20:30:55 · 119 阅读 · 0 评论 -
Java并发编程:Lock
Java并发编程:Lock 在上一篇文章中我们讲到了如何使用关键字synchronized来实现同步访问。本文我们继续来探讨这个问题,从Java 5之后,在java.util.concurrent.locks包下提供了另外一种方式来实现同步访问,那就是Lock。 也许有朋友会问,既然都可以通过synchronized来实现同步访问了,那么为什么还需要提供Lock?这个问题将在下面进行阐述。本文...转载 2018-06-11 16:44:12 · 119 阅读 · 0 评论