并发编程
文章平均质量分 63
多线程使用,高并发场景锁的应用及原理
珞珈山紫竹
希望用最简单的语言去阐释研发
展开
-
多线程中各个锁的原理-专题
1、CAS(比较转换)使用JUC 中的线程安全基础常量AtomicBoolean AtomicInteger AtomicLong 是使用实例原理图解释:注:t1,t2线程是同时更新同一变量56的值因为t1和t2线程都同时去访问同一变量56,所以他们会把主内存的值完全拷贝一份到自己的工作内存空间,所以t1和t2线程的预期值都为56。假设t1在与t2线程竞争中线程t1能去更新变量的值,而其他线程都失败。(失败的线程并不会被挂起,而是被告知这次竞争中失败,...原创 2021-11-29 14:46:24 · 287 阅读 · 0 评论 -
并发编程中的常用的集合
JUC集合(java.util.concurrent)并发编程里常用的集合,由于在高并发的场景下,很多传统的集合不再适用了,所以在JUC包下提供了大量的并发编程场景适用的集合。主要的操作是通过对集合进行加锁操作。主要以阻塞队列和CurrentHashMap为代表。下面单独分析CurrentHashMap。5种常见数据结构:栈,队列,表(hash表),树(二叉树,红黑树,B+),图1、数据结构Hash表哈希表就是一种以键值(key-indexed) 存储数据结构,我们只要输入待..原创 2021-09-22 15:02:52 · 266 阅读 · 0 评论 -
并发编程-阻塞队列
适用于并发场景下,生产者生产的速度要大于消费者的速度,我觉得和分布式队列MQ、和kaffak这些不同的是,分布式队列处理是多个服务,多个系统的这种消费业务(多进程),而阻塞队列处理的是内部程序(线程),而且MQ使用的是计算机内存,阻塞队列使用的是JVM内存。(有一个场景就是在处理从库里面查大量数据,然后进行统计计算的时候)消费者阻塞: 在队列为空时,消费者端的线程都会被自动阻塞,知道数据放入队列,消费者线程会诶自动唤醒并消费数据。生产者阻塞:在队列已满且没有可用空间时,生产者端的线程都会被自原创 2021-09-20 16:42:43 · 170 阅读 · 0 评论 -
并发编程ReentrantLock 锁
Java中除了Synchronized锁还有一种Lock接口,而ReentrantLock是其中比较突出的一种。ReentrantLock通过CAS 算法和AQS来实现线程的同步,Synchronized 通过把资源锁起来的方式,实现线程的同步执行,而ReentrantLock 是通过把多线程进入同步锁来使线程达到同步的效果。ReentrantLock是一个可重入独占锁。使用方法ReentrantLock 通过显示的去操作,何时枷锁何时放锁都在程序员的控制下ReentrantLock原创 2021-09-17 11:20:11 · 175 阅读 · 0 评论 -
并发编程中的锁补充知识
1、可重入锁:可重入锁也叫做递归锁,指同一个线程外层函数获得该锁之后,内层的递归函数仍可以获取该锁。就是线程可以同时获得一个锁多次,synchronized,ReentrantLock都是可重入锁。2、自旋锁如果持有锁的线程能在很短时间内释放锁资源,那么那些等待竞争的锁的线程就不需要做内核态和用户态之间的转换(线程私有内存,和共有内存),进入阻塞,挂起状态等。优点:自旋锁可以减少CPU上下文的切换,对于占用锁的时间非常短或者锁竞争不激烈的代码块来说性能大幅度提升。缺点:线程在自旋过程中会长时原创 2021-09-16 16:12:27 · 101 阅读 · 0 评论 -
从并发编程的角度来看JVM内存模型
从并发的角度来看JVM的内存模型JMM(java memory model)传统意义上的JVM内存模型就是分为5个部分,方法区,本地方法区,栈,堆,计数器。从多线程的角度来看,JVM被分为线程私有区域和线程共享区域通过上面这两张图整合理解,线程的私有区域虚拟机栈,本地方法区,和程序计数器,内存共享区域主要为方法区、和堆。多线程之间的通信:多线程的共享机制有两种一种是消息传递,一种是共享内存。消息传递主要是通过wait() notify() 两个方法来.原创 2021-09-15 23:56:47 · 103 阅读 · 0 评论 -
java 线程池的原理和使用-实现
对于线程池的创建,通过查看底层源码可知,底层都是通过ThreadPoolExecutor创建不过是默认的参数不同罢了。public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit,原创 2021-09-15 17:20:35 · 136 阅读 · 0 评论 -
并发编程Synchronized锁
补充知识:操作锁的原理有两种方式:通过在内存上阻止多线程对对象的获取 在指令集上阻止多线程对指令的执行Java中的每个对象都有一个monitor对象,加锁就是在竞争monitor对象,对代码块加锁是通过在指令前后添加monitorenter和monitorexit 指令实现的。Synchronized 主要通过操作对象的monitor对象来实现锁的synchronized 作用于成员变量和非静态方法时,锁住的是对象实例 synchronized 作用于静态方法时,锁住.原创 2021-09-14 17:44:08 · 138 阅读 · 0 评论 -
java 线程池的原理和使用-原理
每一个方法都是一个任务,Runnable的run方法也不例外。正常情况这些任务都是交给主线程按顺序执行。而Runnable的start方法可以调用系统开辟一条新的线程,用来执行Runnable先的run方法任务。而且一个start只能唤起一个线程执行run方法(就是执行Runnable的实现对象)。线程池的使用可以理解为一个任务调度管理工具,创建一个个的Runnable实现对象(任务),不在需要自己去执行start方法调用线程执行任务,而线程池有一套自己的线程创建和执行方式。线程池使用了Ex原创 2021-09-13 20:19:06 · 223 阅读 · 1 评论 -
Java 并发编程之volatile
什么叫做并发编程:使用多线程充分利用cpu资源提高程序效率 解决多线程带来的线程安全问题·线程内部数据其他线程不可见·多线程打破了代码块的执行原子性(要么同时执行成功,要么同时执行失败)·打破程序执行从上往下执行顺序(上一个线程可能已经在执行下面的代码了,另外一个线程才开始执行上面代码)补充:一行代码并不代表着原子操作,只有一个汇编指令才是原子操作,所有非原子操作在多线程执行时都会出现线程不安全问题。并发的3个基本概念(为了解决线程不安全问题,要保证三个基本操作)原子原创 2021-09-11 17:37:19 · 452 阅读 · 1 评论 -
JAVA中的并发编程(多线程)
一、进程和线程的进程是操作系统的运行单元,会独立给进程分配资源,可以理解为操作系统的一个单独执行的程序。线程是任务执行单元依赖于进程而存在,同一进程的多线程可以共享内存数据。并发编程并发编程的特点就是通过多线程的技术将CPU的性能发挥到极致,提升系统性能,高并发的系统开发并发编程会显得尤为重要。并发编程会遇到的问题:内存泄露(内存没有办法被回收),线程安全,死锁。二、并发编程的三要素:原子性,可见性(一个线程对共享变量的修改另一个变量能看到),有序性线程的生命周期原创 2021-09-09 18:02:45 · 794 阅读 · 0 评论