
java多线程
文章平均质量分 94
P19777
这个作者很懒,什么都没留下…
展开
-
java中的Identity hashcode带来的偏向锁膨胀
注意:看该篇文章之前您需要了解java对象头首先介绍一个工具,能查看java对象头信息<dependency> <groupId>org.openjdk.jol</groupId> <artifactId>jol-core</artifactId> <version>0.8</versi...原创 2019-11-18 17:26:01 · 2076 阅读 · 1 评论 -
理解JVM中的synchronized优化 偏向锁、轻量级锁、重量级锁
为了换取性能,JVM在内置锁上做了非常多的优化,膨胀式的锁分配策略就是其一。这里只讲这几种锁的概念,并不讲解锁的细节和详细的膨胀过程。1.偏向锁在某些时候,对于某个锁而言,可能并不存在多个锁来对他进行竞争。也就是说,访问该锁的始终都是一个线程,那么这种情况下,就完全没有必要进行复杂的获取锁的操作。就比如说我们可能在方法中创建了一个StringBuffer类型的变量,我们都知道该对象是线程安全...原创 2019-12-29 21:22:10 · 618 阅读 · 0 评论 -
读写锁性能之王 —— StampedLock
一. StampedLock概述1.1 简介StampedLock是JDK1.8中新增的一个读写锁,也是对JDK1.5中的读写锁ReentrantReadWriteLock的优化。主要包括读写锁之间的转换及更加细粒度并发控制等,前者提供的是不可重入锁,后者的是可重入锁,但是前者通过了乐观读锁在多线程并发中的读多情况下有更好的性能,因为StampedLock获取乐观读锁时,居然不需要通过CAS...转载 2020-03-17 10:50:09 · 261 阅读 · 0 评论 -
详解FutureTask
介绍FutureTask之前,不得不提一下FutureFutureFuture代表了一个异步计算的执行结果,并且提供了一些方法来检测计算是否完成,等待计算完成,并且获取计算结果。还提供了一些额外的方法判断计算是否正常完成或者被取消,如果一个任务已经完成了,那么他是不能被取消的接口中的5个方法// 取消计算boolean cancel(boolean mayInterruptIfRunn...原创 2020-01-15 16:31:27 · 253 阅读 · 0 评论 -
ReentrantLock公平锁与非公平锁对比
之前一直以为公平锁和非公平锁的实现是一种非常复杂的实现机制,直到今天看了源码在ReentrantLock中,我们默认使用的就是非公平锁下面就是其源码,其实实现非常的简单static final class NonfairSync extends Sync { private static final long serialVersionUID = 7316153563...原创 2019-12-08 15:49:05 · 263 阅读 · 0 评论 -
等待超时最佳实例
一般对于昂贵的资源,我们都会选择使用等待超时模式为什么要使用等待超时?假设说我们现在使用tomcat,配置了固定的100个线程去处理客户端请求,然后又一个数据库连接池,连接池中维护了10个连接。现在有10个线程获取到了连接,他们都要占用这个连接10秒,那么其他线程如果要一直等待下去的话,这个代价非常的大。客户端不可能等待你一个请求那么就,且你一个请求一直占用住一个线程,会导致新的请求进不来...原创 2019-12-08 00:06:33 · 312 阅读 · 0 评论 -
ThreadLocal的两种实现方式
ThreadLocal的两种实现方式1.一个ThreadLocal对象内部有一个map,然后在每一个线程中获取值的时候,根据当前线程作为key到map中去获取对应的值因为ThreadLocal中的值在每个线程中有一个副本,所以这种方式也非常的合适但是缺点在于,多个线程会一起竞争同一个ThreadLocal对象的map,就会出现竞争,要想避免竞争,就要进行加锁还有一个需要注意的点就是,如果我...原创 2019-12-01 23:49:20 · 354 阅读 · 0 评论 -
双重检索的单例模式为什么需要volitile修饰?
下面是一个存在安全性问题的双重检索的单例模式private static DoubleCheckSingleton doubleCheckSingleton;private Object t;private DoubleCheckSingleton() { t = new Object();}public static DoubleCheckSingleton get...原创 2019-11-30 22:43:20 · 915 阅读 · 0 评论 -
MESI--CPU缓存一致性协议
MESI协议中的状态CPU中每个缓存行(caceh line,缓存中可分配的最小存储单元)使用4种状态进行标记(使用额外的两位(bit)表示):M: 被修改(Modified)该缓存行只被缓存在该CPU的缓存中,并且是被修改过的(dirty),即与主存中的数据不一致,该缓存行中的内存需要在未来的某个时间点(允许其它CPU读取请主存中相应内存之前)写回(write back)主存。当被写回主...原创 2019-11-18 12:43:23 · 1051 阅读 · 3 评论 -
Java线程与Linux内核线程的映射关系
Java线程与Linux内核线程的映射关系Linux从内核2.6开始使用NPTL (Native POSIX Thread Library)支持,但这时线程本质上还轻量级进程。Java里的线程是由JVM来管理的,它如何对应到操作系统的线程是由JVM的实现来确定的。Linux 2.6上的HotSpot使用了NPTL机制,JVM线程跟内核轻量级进程有一一对应的关系。线程的调度完全交给了操作系统内...转载 2019-09-19 21:29:58 · 566 阅读 · 0 评论 -
JAVA多线程笔试题-多个线程向多个文件写入内容
四个线程t1,t2,t3,t4,向4个文件中写入数据,t1只能写入1,t2只能写入2,t3只能写入3,t4只能写入4对4个文件A,B,C,D写入如下内容:A:123412341234.....B:234123412341....C:341234123412....D:412341234123....怎么实现同步可以让线程并行工作?从网络上看到有些人贴出的代码的答案,用一个锁...原创 2019-09-17 13:14:53 · 1277 阅读 · 4 评论 -
Synchronization on a non-final field提示的缘由
引入写代码的时候发现idea再sync代码块的位置出现这个提示,刚开始没有注意,后来出现问题了才知道其中的缘由。看下面这段代码public class T implements Runnable{ Boolean b = new Boolean(false); public static void main(String[] args) throws Interru...原创 2019-07-23 10:34:10 · 4756 阅读 · 2 评论 -
Synchronized之管程
Java对象如何与Monitor关联如图所示,依次对图中进行解释。java对象与monitor的关联图我们知道JVM堆中存放的是对象实例。对象实例包括几个部分。分别是与对象实例无关的对象头,实例数据,填充数据。 对象头中包括几个部分:Mark Word和指向元数据的指针。所占内存为2*JVM位数(在32bitJVM中就占8个字节)。Mark Word和指向元数据的指针分别占一个J...转载 2019-07-02 20:08:23 · 559 阅读 · 0 评论 -
java实现读写者问题的简单代码
1.读写者问题一个数据对象如果被多个进程所共享,且其中的一些线程只需要读取数据,而另外一些线程需要对数据进行修改。这就被称为读写者问题。其条件要求如下允许多个线程同时读 一次只允许一个写线程进行写操作 如果有一个写线程正在进行写操作,禁止任何线程的读操作其实我们只需要解决两个问题,即写者和第一个读者之间的互斥,写者和写者之间的互斥。进而得到了以下代码import java....原创 2019-07-02 19:54:24 · 697 阅读 · 0 评论