
java并发
那些年的代码
Java工作者
展开
-
java 关于锁常见面试题
1、synchronized作用于静态方法和非静态方法的区别非静态方法:给对象加锁(可以理解为给这个对象的内存上锁,注意 只是这块内存,其他同类对象都会有各自的内存锁),这时候在其他一个以上线程中执行该对象的这个同步方法(注意:是该对象)就会产生互斥静态方法: 相当于在类上加锁(*.class位于代码区,静态方法位于静态区域,这个类产生的对象公用这个静态方法,所以这块内存,N个对象...原创 2020-04-19 10:18:34 · 377 阅读 · 0 评论 -
java锁机制的面试题
1、ABA问题CAS 会导致“ABA问题”。CAS 算法实现一个重要前提需要取出内存中某时刻的数据,而在下时刻比较并替换,那么在这个时间差类会导致数据的变化。比如说一个线程 one 从内存位置 V 中取出 A,这时候另一个线程 two 也从内存中取出 A,并且 two 进行了一些操作变成了 B,然后 two 又将 V 位置的数据变成 A,这时候线程 one 进行 CAS 操作发现内存中...原创 2020-04-18 16:10:52 · 2575 阅读 · 0 评论 -
面试必备之乐观锁与悲观锁
何谓悲观锁与乐观锁 乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源...原创 2020-03-28 10:37:19 · 143 阅读 · 0 评论 -
Java中的CAS实现原理
一、什么是CAS? 在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为新的给定值。 这是作为单个原子操作完成的。 原子性保证新值基于最新信息计算; 如果该值在同一时间被另一个线程更新,则写入将失败。 操作结果必须说明是否进行替换; 这可以通过一个简单的布尔响应(...原创 2020-01-14 10:57:15 · 187 阅读 · 0 评论 -
java并发-原子性
原子性就是指该操作是不可再分的。java.util.concurrent.atomic中有一组使用无锁算法实现的原子操作类。AtomicInteger、AtomicBoolean、AtomicLong 外还有AtomicReference 。它们分别封装了对整数、整数数组、长整型、长整型数组和普通对象的多线程安全操作。这些都是居于CAS算法实现的。CAS即:Compare and Sw...原创 2020-01-10 18:38:00 · 101 阅读 · 0 评论 -
CountDownLatch的理解和使用
在笔者想要了解Thrift时候,找到一个博主写的系统间通信技术的架构设计,在了解和学习的过程中遇到很多小问题和基础知识,自己还是不够清楚,就查询和总结下。因为笔者也都是从网上找的一些资料,好的资料笔者都是自己收敲一遍,这样觉得能够加深下印象,引发更多的思考,毕竟很多时候笔者感觉自己都是七秒的记忆。在第一篇文章中遇到了一个CountDownLatch同步计数器,当计数器数值减为0时,所...原创 2020-01-10 16:14:25 · 141 阅读 · 0 评论 -
countDownLatch
1.背景:countDownLatch是在java1.5被引入,跟它一起被引入的工具类还有CyclicBarrier、Semaphore、concurrentHashMap和BlockingQueue。 存在于java.util.cucurrent包下。2.概念countDownLatch这个类使一个线程等待其他线程各自执行完毕后再执行。 是通过一个计数器来实现的,计数器的初始值是线...原创 2020-01-10 15:31:21 · 91 阅读 · 0 评论 -
Java原子性操作之——Atomic包的原理分析
Atomic: Atomic包是java.util.concurrent下的另一个专门为线程安全设计的java的包,包含多个原子性操作的类。基本特性就是在多线程情况下,当多个线程想要同时操作这些类的某些实例方法时,具有排他性,也就是当某个线程在执行某个方法时,不会被其他线程打断,其他线程会在外部等待,一直等到该方法执行完毕,才由JVM从等待队列中选择另一个线程进入,这只是一种逻辑上的理...转载 2020-01-09 18:58:08 · 179 阅读 · 0 评论 -
Executors.newSingleThreadScheduledExecutor();线程池中放入多个线程问题
import java.util.Date;import java.util.concurrent.Executors;import java.util.concurrent.ScheduledExecutorService;import java.util.concurrent.ScheduledFuture;import java.util.concurrent.TimeUnit;...原创 2019-10-11 17:02:32 · 1267 阅读 · 0 评论 -
Executors.newSingleThreadScheduledExecutor() 问题
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); service.scheduleWithFixedDelay(newRunnable() { @Override publicvoidrun() { test1...原创 2019-10-11 16:52:19 · 1764 阅读 · 0 评论 -
JAVA线程池原理详解一
线程池的优点1、线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。2、可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。线程池的创建1 public ThreadPoolExecutor(int corePoolSize,2 int maxi...原创 2019-10-11 11:52:56 · 98 阅读 · 0 评论 -
ConcurrentHashMap源码分析(JDK8) 扩容实现机制
jdk8中,采用多线程扩容。整个扩容过程,通过CAS设置sizeCtl,transferIndex等变量协调多个线程进行并发扩容。扩容相关的属性nextTable扩容期间,将table数组中的元素 迁移到 nextTable。 /** * The next table to use; non-null only while resizing. ...原创 2019-06-17 10:50:23 · 381 阅读 · 0 评论 -
Java并发编程:volatile关键字解析
volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。在Java 5之后,volatile关键字才得以重获生机。 volatile关键字虽然从字面上理解起来比较简单,但是要用好不是一件容易的事情。由于volatile关键字是与Java的内存模型有关的,因此在讲述volatile关键之前,我...原创 2019-06-11 11:17:08 · 139 阅读 · 0 评论