多线程
文章平均质量分 87
liu1002880404
这个作者很懒,什么都没留下…
展开
-
看图识java
原创 2020-09-07 10:55:36 · 143 阅读 · 0 评论 -
volatile 关键字详解
Java volatile 关键字 在Java中,valatile关键字被用来标识一个Java变量 ”being stored in main memory“。更准确地讲,每次读取一个volatile变量都会从主存中去读,而不是从CPU缓存中;每次修改一个volatile变量都会将其写入到主存中,而不仅仅是CPU缓存中。 在一个多线程的程序中,多个线程操作一个非volatile修饰的变量,每个线程可能会把变量从主存复制到CPU缓存中去,处于性能原因,如果你的计算机装有多个CPU,每个线程可能运行在不同.原创 2020-07-23 11:47:42 · 327 阅读 · 0 评论 -
多线程之死锁介绍及预防
死锁 当多个线程同时需要同一个锁,但是以不同的方式获取它们。例如,如果线程1持有锁A,然后请求锁B,线程2已经持有锁B,然后请求锁A,这样一个死锁就发生了。线程1永远也得不到锁B,线程2永远也得不到锁A。它们永远也不知道这种情况。public class TreeNode { TreeNode parent = null; List children = new ArrayList(); public synchronized void addChild(Tre...原创 2020-07-23 12:39:09 · 543 阅读 · 0 评论 -
多线程 / 高并发 bat面试题
多线程 / 高并发 1. stop() 和 suspend() 方法为何不推荐使用? 反对使用 stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象 处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出 真正的问题所在。 suspend() 方法容易发生死锁。调用 suspend() 的时候,目标线程会停下来,但却仍 然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被 "挂 起" 的线程恢复运行。对任何线程来说,如原创 2020-09-19 11:58:51 · 486 阅读 · 0 评论 -
多线程几个重要概念
简单解释下多线程中的重要概念活跃性: 意味着正确的事情最终会发生活跃性问题: 比如单线程中出现的无限循环性能问题:和活跃性问题相对, 活跃性问题意味着正确的事情一定会发生,但是不够好,我们希望正确的事情尽快发生线程安全性: 一个类,被多个线程同时调用,且多个线程不需要额外的同步机制,就能保证这个类的方法被正确执行,那么这个类就是安全的原子性:count++就不是原子操作,它分为读取修改写入三个操作,boolean的读写是原子操作竞态条件: 最常见的就是先检查后执行.意味着程序...原创 2021-06-19 13:37:43 · 93 阅读 · 0 评论 -
从Java多线程可见性谈Happens-Before原则
从Java多线程可见性谈Happens-Before原则Happens-Before是一个非常抽象的概念,然而它又是学习Java并发编程不可跨域的部分。本文会先阐述Happens-Before在并发编程中解决的问题——多线程可见性,然后再详细讲解Happens-Before原则本身。Java多线程可见性在现代操作系统上编写并发程序时,除了要注意线程安全性(多个线程互斥访问临界资源)以外,还要注意多线程对共享变量的可见性,而后者往往容易被人忽略。可见性是指当一个线程修改了共享变量的值,.原创 2020-09-28 16:15:28 · 176 阅读 · 0 评论 -
Java多线程安全发布对象
Java多线程环境下对象安全的构建方式在并发编程中Happens-Before原则对多线程共享变量的重要性。要想确保让一个线程对共享变量的修改能被其它线程感知到,就必须让两个线程中的操作满足Happens-Before原则。在构建一个对象的过程中,更要考虑到多线程间共享数据的一致性问题,否则很可能会发生一个在A线程中构建完整的对象,在B线程中看到的却只被构建了一部分。例如下面的代码:public class UnsafeLazyInitialization { private .原创 2020-09-28 16:23:50 · 218 阅读 · 0 评论 -
并发编程之深入理解Java中的不可变对象
深入理解Java中的不可变对象 一.什么是不可变对象 下面是《Effective Java》这本书对于不可变对象的定义: 1 不可变对象(Immutable Object):对象一旦被创建后,对象所有的状态及属性在其生命周期内不会发生任何变化。 从不可变对象的定义来看,其实比较简单,就是一个对象在创建后,不能对该对象进行任何更改。比如下面这段代码: 1 2 3 4 5 6 7 8原创 2020-09-29 08:49:57 · 272 阅读 · 0 评论 -
线程封闭和ThreadLocal详解
线程封闭什么是线程封闭当访问共享变量时,往往需要加锁来保证数据同步。一种避免使用同步的方式就是不共享数据。如果仅在单线程中访问数据,就不需要同步了。这种技术称为线程封闭。在Java语言中,提供了一些类库和机制来维护线程的封闭性,例如局部变量和ThreadLocal类Ad-hoc 线程封闭程序控制实现,比较脆弱,尽量少用 堆栈封闭:局部变量,无并发问题,在项目中使用最多,简单说就是局部变量,方法的变量都拷贝到线程的堆栈中,只有这个线程能访问到。尽量少使用全局变量(变量不是常量) Thre.原创 2020-09-30 08:30:58 · 281 阅读 · 0 评论 -
HashMap 线程不安全原因介绍
HashMap 为什么线程不安全? 1.jdk1.7中的HashMap 1.1 扩容造成死循环分析过程 1.2 扩容造成数据丢失分析过程 2.jdk1.8中HashMap 总结 前言:我们都知道HashMap是线程不安全的,在多线程环境中不建议使用,但是其线程不安全主要体现在什么地方呢,本文将对该问题进行解密。1.jdk1.7...原创 2020-04-28 15:18:27 · 428 阅读 · 0 评论 -
无锁---用AtomicStampedReference解决ABA问题
用AtomicStampedReference解决ABA问题在运用CAS做Lock-Free操作中有一个经典的ABA问题:线程1准备用CAS将变量的值由A替换为B,在此之前,线程2将变量的值由A替换为C,又由C替换为A,然后线程1执行CAS时发现变量的值仍然为A,所以CAS成功。但实际上这时的现场已经和最初不同了,尽管CAS成功,但可能存在潜藏的问题,例如下面的例子:现有一个用单向链表实现的堆栈,栈顶为A,这时线程T1已经知道A.next为B,然后希望用CAS将栈顶替换为B:hea.原创 2020-11-24 13:30:49 · 209 阅读 · 0 评论 -
FutureTask详解以及实现
FutureTask 我们先来看一下FutureTask的实现: 1 publicclassFutureTask<V>implementsRunnableFuture<V> FutureTask类实现了RunnableFuture接口,我们看一下RunnableFuture接口的实现: 1 2 3 publicinterfaceRunnableFuture<V&g...原创 2020-09-03 17:55:24 · 471 阅读 · 0 评论 -
收集大厂多线程,线程安全类面试题
Java集合中线程安全的有哪些? Vector->SynchronizedList->CopyOnWriteArrayList SynchronizedSet->CopyOnWriteArraySet SynchronizedMap->ConcurrentHashMap 线程的创建方式 继承Thread类创建线程 public class ThreadTest extends Thread{ //重写run()方法,run()方法的方..原创 2020-09-02 17:33:58 · 233 阅读 · 0 评论 -
生产者消费者模式的具体实现
生产者消费者模式的实现(java实现)生产者消费者问题是线程模型中的经典问题:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据。阻塞队列就相当于一个缓冲区,平衡了生产者和消费者的处理能力。这个阻塞队列就是用来给生产者和消费者解耦的。wait/notify方法首先,我们搞清楚Thread.sleep()方法和Object.wait()、Object.notify()方法的区别。 sleep()是Thread类的方法;而wait(),noti.原创 2020-09-02 11:31:38 · 99 阅读 · 0 评论 -
生产者和消费者模式综述
本文主要阐释“生产者-消费者"的设计模式,并重点讲述缓冲区在该模型里面的作用以及缓冲区的两种实现方法(队列缓冲区和环形缓冲区),并简述在涉及并发时线程和进程各自的特点与使用场合。1|0简 介生产者消费者模式并不是GOF提出的23种设计模式之一,23种设计模式都是建立在面向对象的基础之上的,但其实面向过程的编程中也有很多高效的编程模式,生产者消费者模式便是其中之一,它是我们编程过程中最常用的一种设计模式。在实际的软件开发过程中,经常会碰到如下场景:某个模块负责产生数据,这些数据由另一个..原创 2020-09-02 08:43:35 · 589 阅读 · 0 评论 -
java内存模型介绍
####Java内存模型Java内存模型描述了Java虚拟机和计算机内存之间是如何协同工作的。一个Java虚拟机也是一个完整的计算机的模型,因此,这个模型自然也包含了内存模型。如果你想写出表现良好的并发程序就必须理解Java内存模型。Java内存模型描述了不同线程间如何和何时看到被其他线程修改的共享变量以及在需要时如何同步访问共享变量。原来的Java内存模型存在很多不足,所以在Java5时进行了修改。这个一直使用至今。####Java内存模型每个运行在Java虚拟机中的线程都拥有自己的线程栈。这原创 2020-08-21 10:21:19 · 291 阅读 · 0 评论 -
分析同步器相同点
###剖析同步器虽然许多同步器(如锁,信号量,阻塞队列等)功能上各不相同,但它们的内部设计上却差别不大。换句话说,它们内部的的基础部分是相同(或相似)的。了解这些基础部件能在设计同步器的时候给我们大大的帮助。这就是本文要细说的内容。大部分同步器都是用来保护某个区域(临界区)的代码,这些代码可能会被多线程并发访问。要实现这个目标,同步器一般要支持下列功能:状态访问条件状态变化通知策略Test-and-Set方法Set方法并不是所有同步器都包含上述部分,也有些并不完全遵照上面的内容。但通常原创 2020-08-21 09:09:43 · 189 阅读 · 0 评论 -
多线程给我们带来了什么
开发中所用到的多线程实例越来越多,同时java JDK提供的多线程并发类越来越完善,那么多线程给我们带来了什么呢? 更好的资源利用 磁盘IO、网络IO等 在一些情景下简化程序设计 提高程序响应性 多线程的开销不要为了多线程而使用多线程 更复杂的设计 控制临界资源的访问 出现问题,难以调试、重现和修复 ... 上下文切换次数过高 当CPU发生上下文切换时,需要保存现场原创 2020-08-21 08:49:48 · 172 阅读 · 0 评论 -
阻塞算法与非阻塞算法对比及分析
###非阻塞算法在并发上下文中,非阻塞算法是一种允许线程在阻塞其他线程的情况下访问共享状态的算法。在绝大多数项目中,在算法中如果一个线程的挂起没有导致其它的线程挂起,我们就说这个算法是非阻塞的。为了更好的理解阻塞算法和非阻塞算法之间的区别,先介绍一下阻塞算法然后再介绍非阻塞算法。####阻塞并发算法一个阻塞并发算法一般分下面两步:执行线程请求的操作阻塞线程直到可以安全地执行操作很多算法和并发数据结构都是阻塞的。例如,java.util.concurrent.BlockingQueue的不同原创 2020-08-21 08:44:33 · 915 阅读 · 1 评论 -
Disruptor并发框架讲解
Disruptor并发框架什么是DisruptorMartin Fowler在自己网站上写了一篇LMAX架构的文章,在文章中他介绍了LMAX是一种新型零售金融交易平台,它能够以很低的延迟产生大量交易。这个系统是建立在JVM平台上,其核心是一个业务逻辑处理器,它能够在一个线程里每秒处理6百万订单。业务逻辑处理器完全是运行在内存中,使`用事件源驱动方式。业务逻辑处理器的核心是Disruptor。Disruptor它是一个开源的并发框架,并获得2011 Duke’s 程序框架创新奖,能够在无锁的情况下原创 2020-07-06 10:01:17 · 264 阅读 · 0 评论 -
java锁深度讲解
Java锁的深度化悲观锁、乐观锁、排他锁场景当多个请求同时操作数据库时,首先将订单状态改为已支付,在金额加上200,在同时并发场景查询条件下,会造成重复通知。SQL:Update悲观锁与乐观锁悲观锁:悲观锁悲观的认为每一次操作都会造成更新丢失问题,在每次查询时加上排他锁。每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都..原创 2020-07-06 09:30:41 · 202 阅读 · 0 评论 -
Callable futrue 模型讲解 锁机制
Callable在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或共享存储区以及线程通信的方式实现获得任务结果的目的。不过,Java中,也提供了使用Callable和Future来实现获取任务结果的操作。Callable用来执行任务,产生结果,而Future用来获得结果。Callable接口与Runnable接口是否相似,查看源码,可知Callable接口的定义如原创 2020-07-06 09:24:33 · 200 阅读 · 0 评论 -
线程工具类讲解及线程池原理
线程池原理分析并发包(计数器)CountDownLatchCountDownLatch 类位于java.util.concurrent包下,利用它可以实现类似计数器的功能。比如有一个任务A,它要等待其他4个任务执行完毕之后才能执行,此时就可以利用CountDownLatch来实现这种功能了。CountDownLatch是通过一个计数器来实现的,计数器的初始值为线程的数量。每当一个线程完成了自己的任务后,计数器的值就会减1。当计数器值到达0时,它表示所有的线程已经完成了任务,然后在闭锁上等待的线程就原创 2020-07-06 08:59:17 · 230 阅读 · 0 评论 -
多线程知识(四)并发编程
深入理解Java多线程与并发编程一、目标多线程三大特性Java内存模型VolatileThreadLoca线程池二、线程三大特性多线程有三大特性,原子性、可见性、有序性2.1什么是原子性即一个操作或者多个操作 要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行。一个很经典的例子就是银行账户转账问题:比如从账户A向账户B转1000元,那么必然包括2个操作:从账户A减去1000元,往账户B加上10...原创 2020-07-04 10:39:55 · 157 阅读 · 0 评论 -
多线程知识(三) 多线程通讯
多线程之间实现通讯目标多线程之间如何通讯wait、notify、notifyAll()方法lock停止线程守护线程Join方法优先级Yield多线程之间如何实现通讯2.1 什么是多线程之间通讯? 多线程之间通讯,其实就是多个线程在操作同一个资源,但是操作的动作不同。2.2 多线程之间通讯需求需求:第一个线程写入(input)用户,另一个线程取读取(out)用户.实现读一个,写一个操作。2.3代码实现基本实现2.3.1共享资源源实体类...原创 2020-07-04 10:12:30 · 174 阅读 · 0 评论 -
多线程知识(二)多线程之间安全同步
多线程之间实现同步一、目标理解线程安全?synchronized用法死锁二、什么是线程安全?2.1 为什么有线程安全问题?当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是线程安全问题。但是做读操作是不会发生数据冲突问题。案例:需求现在有100张火车票,有两个窗口同时抢火车票,请使用多线程模拟抢票效果。代码: classThreadTrain1 implementsRunnable { // ...原创 2020-07-03 23:29:04 · 243 阅读 · 0 评论 -
多线程知识(一)初识多线程
多线程快速入门一、本课目标线程与进程区别为什么要使用多线程?多线程应用场景多线程创建方式二、线程与进程区别每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。使用线程可以把占据时间长的程序中的任务放到后台去处理,程序的运行速度可能加快,在一些等待的任务实现上如用户输入原创 2020-07-03 23:11:42 · 148 阅读 · 0 评论 -
线程安全介绍及举例
“什么是线程安全”不是线程的安全“什么是线程安全”,“线程安全”也不是指线程的安全,而是指内存的安全。目前主流操作系统都是多任务的,即多个进程同时运行。为了保证安全,每个进程只能访问分配给自己的内存空间,而不能访问别的进程的,这是由操作系统保障的。在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内存)。进程内的所有线程都可以访问到该区域,这就是造成问题的潜在原因。假...原创 2020-04-29 16:46:24 · 588 阅读 · 0 评论