多线程与高并发(进程内高并发)
文章平均质量分 76
silence、J
这个作者很懒,什么都没留下…
展开
-
代码加锁的常见问题
一、业务逻辑中的并发问题1. 示例当存在 一个类中 的 两个方法 同时被 多个线程 执行操作 共享资源 时,需要考虑加锁。示例如下:public class LockTest_1 { private static final Logger log = LoggerFactory.getLogger(LockTest_1.class); volatile int a = 1; volatile int b = 1; public void add() {原创 2021-05-16 15:18:13 · 1006 阅读 · 0 评论 -
老旧的Vector与HashTable
在最开始的JDK1.0容器里只有两个,一个是Vector,实现List接口,底层是数组;一个是HashTable实现Map接口。这两个容器设计成了方法都是加synchronized的,是线程安全的,这是它最早设计不太合理的地方。因为多数情况下程序只有一个线程在工作,完全没有必要加synchronized,所以最开始的时候设计的性能比较差,所以后来在Hashtable之后又添加HashMap,HashMap就是完全的没有加锁。虽然HashMap效率高,但是HashMap没有加锁,不是线程安全的,那么怎么才能原创 2020-05-19 14:48:23 · 162 阅读 · 0 评论 -
Java容器分类
本文相当于一个目录,用来指导我之后的学习内容。容器分类容器的第一个接口是Collection叫集合。集合不管这个容器是什么结构都能把元素放在里面,是一个一个地放;Map是以键值对的方式往里放。其实Map可以看作是Collection一个特殊的变种,可以把一对对象看成一个entry对象,所以这也是一整个对象。容器就是用来装一个个对象的。严格来讲数组也属于容器。从数据结构角度来讲在物理上的这种存储的数据结构其实只有两种,一种是连续存储的数组Array,另一种就是非连续存储的一个指向另外一个的链表。Que原创 2020-05-19 10:56:43 · 610 阅读 · 0 评论 -
ThreadLocal的使用及源码阅读
ThreadLocal的含义及使用ThreadLocal看字面意思,Thread 线程,Local 本地,它是什么意思?通过一个小程序来解释:public class ThreadLocalTest_01 { volatile static Person person = new Person(); public static void main(String[] args) { new Thread(() -> { try {原创 2020-05-16 15:35:05 · 99 阅读 · 0 评论 -
线程和锁的基本概念汇总
该文是应用层面的一些概念总结,更底层的原理请参考其他文章。一. 进程和线程有什么区别?进程 就是一个程序运行起来的状态线程 是一个进程中的不同的执行路径,是一个进程中的最小执行单元更专业的说法:进程是OS分配资源的基本单位,线程是执行调度的基本单位。分配资源最重要的是:独立的内存空间,线程调度执行(线程共享进程的内存空间,没有自己独立的内存空间)二. 创建线程的几种方式package ...原创 2020-04-26 10:31:37 · 360 阅读 · 0 评论 -
CAS无锁优化&ABA问题
本文内容:Atomic原子类CAS(无锁优化,乐观锁)ABA问题Unsafe对某些常见操作,加锁的情况有很多,所以Java提供了一些类来实现这种操作,这些类内部自动带了锁,但这锁不是synchronized实现,而是CAS的操作来实现的。Atomic原子类以AtomicXXX开头的都是用CAS操作来保证线程安全的类。在开发工作中经常有多个线程共同访问一个值,改变一个值的场景,这...原创 2020-05-19 21:58:38 · 268 阅读 · 0 评论 -
Atomic类&LongAdder
Atomic原子类以AtomicXXX开头的都是用CAS操作来保证线程安全的类。在开发工作中经常有多个线程共同访问一个值,改变一个值的场景,这时就可以使用原子类如AtomicInteger。这里面包含了int类型,这个int类型的自增count++是线程安全的,取值也是线程安全的。如下,不用再对m()加synchronized,输出一定为10万public class AtomicInte...原创 2020-05-06 18:10:03 · 192 阅读 · 0 评论 -
基于CAS的一些锁(1)- ReentrantLock
synchronized的可重入性如果一个同步方法m1中调用了另一个同步方法m2,并且这两个方法加的是同一把锁。那么在一个线程调用m1时就得到了这把锁,m1中调m2时发现是同一个线程,m2也能得到这把锁。这是锁的可重入。所谓可重入锁就是拿到这把锁之后可以再加多道锁,但锁定的还是同一对象,被嵌套调用的同步方法执行完就去一道。public class SyncTest_03 { pub...原创 2020-05-07 18:42:18 · 330 阅读 · 0 评论 -
基于CAS的一些锁(2)- CountDownLatch
CountDown 倒数 , Latch 门闩。顾名思义是倒数门闩,321倒数完毕门闩打开。CountDownLatch主要有三个方法:countDown() 执行倒数await() 阻塞等待,相当于门闩,countDown到0时门闩打开。await(2, TimeUnit.SECONDS) 可设置最长等待时间,超时后若还没countDown到0,门闩自动打开public cla...原创 2020-05-07 22:06:58 · 206 阅读 · 0 评论 -
基于CAS的一些锁(3)- CyclicBarrier
这个同步工具CyclicBarrier直译为循环栅栏。立一个栅栏挡在前面,后面人满后把栅栏打开放行,再关闭栅栏,如此循环。CyclicBarrier构造方法第一个参数为:在栅栏前等待的线程数;第二个参数为:Runnable对象,是栅栏被打开时所做的操作,这个参数也可不传默认不做任何操作。public class T03_CyclicBarrier { public static vo...原创 2020-05-08 11:10:27 · 165 阅读 · 0 评论 -
基于CAS的一些锁(4)- Phaser
phase 是阶段的意思。Phaser是按照不同阶段执行线程的,就像是结合了CountDownLatch和CyclicBarrier,它本身维护着一个叫 phase 的成员变量代表当前执行的阶段。如果程序中遇到分好几个阶段执行,并且有的阶段需要多个线程共同参与的情况下可能会用到Phase。示例:这里模拟了一个结婚的场景自定义一个MarriagePhaser 继承 Phaser 重写Phas...原创 2020-05-08 20:37:49 · 322 阅读 · 0 评论 -
基于CAS的一些锁(5)- ReadWriteLock
ReadWriteLock 读写锁。读写锁的概念其实就是共享锁和排他锁,读锁就是共享锁,写锁就是排他锁。如何理解?读写有很多种情况,比如数据库中的某条数据放在内存里读的时候特别多,而改的时候并不多。举个简单的例子,比如公司的组织结构,要想显示这组织结构下有哪些人在网页上访问,这个组织结构被访问会经常被读,却很少更改。这时如果好多线程来共同访问这个组织结构的话,有的是读线程有的是写线程,保证...原创 2020-05-08 22:11:59 · 159 阅读 · 0 评论 -
基于CAS的一些锁(6)- Semaphore
基本概念Semaphore 信号标的意思,作用其实就是限流,构造方法中可以传一个参数permits表示允许同时执行线程的数量。也可看成是信号标、许可标记的数量。semaphore.acquire()是阻塞方法,获取不到信号标就阻塞,获取到的话信号标permits会减1。比如Semaphore semaphore = new Semaphore(1),一个线程semaphore.acquire...原创 2020-05-09 11:55:06 · 239 阅读 · 0 评论 -
基于CAS的一些锁(7)- Exchanger
Exchanger 交换器,用于两个线程之间交换数据。可以把exchanger想象成一个容器,这个容器有两个值,两个线程,有两个格的位置,第一个线程执行到exchanger.exchange的时候,阻塞,但是要注意exchange方法执行时是往里面传了一个值的,你可以认为把T1扔到第一个格子了,然后第二个线程开始执行,也执行到exchange,他把自己的值T2扔到第二个格子里。接下来这两个值交换...原创 2020-05-09 18:40:15 · 239 阅读 · 0 评论 -
LockSupport的使用
因为wait()方法需要释放锁,所以必须在synchronized中使用,否则会抛出异常IllegalMonitorStateExceptionnotify()方法也必须在synchronized中使用,并且应该指定对象synchronized()、wait()、notify()对象必须一致,一个synchronized()代码块中只能有一个线程调用wait()或notify()以上诸...原创 2020-05-11 10:52:10 · 201 阅读 · 0 评论 -
AQS原理及源码浅析
什么是AQS?AQS 即 AbstractQueuedSynchronizer 抽象队列同步器,它是Java并发用来构建锁和其他同步工具的基础框架,是一个抽象类。AQS定义了一套多线程访问共享资源的同步器框架,许多同步类实现都依赖于它,如常用的ReentrantLock、Semaphore、CountDownLatch。ReentrantLock是如何加锁的?AQS是如何被使用的?ReentrantLock 通过调用对象的lock()和unlock()方法来加锁解锁,下面分析一下源码中加锁的过程,在原创 2020-05-14 17:54:21 · 369 阅读 · 0 评论