并发编程
Java并发编程
Blakie
You got a dream, you gotta protect it.
展开
-
sleep() 与 wait() 的区别
1. sleep()方法是属于Thread类中的。而wait()方法,则是属于Object类中的。2. wait()和sleep()都是让出CPU占有权,让其它线程能够得到运行,不同的地方在于wait()可以通过notify()或者notifyAll()主动唤醒或者wait()等待一定的时间自动恢复运行,而sleep方法只能在等待一定的时间后自动恢复运行,但是他的监控状态依然保持着。3. 在调用sleep()方法的过程中,线程不会释放对象锁。 而当调用wait()方法的时候,线程会放弃对象锁,进入等原创 2020-05-12 11:05:38 · 218 阅读 · 0 评论 -
Java volatile关键字
1、volatile简介说简单点,volatile就是表示某变量是不稳定的、易变的。volatile作为java中的关键词之一,用以声明变量的值可能随时会别的线程修改,使用volatile修饰的变量会强制将修改的值立即写入主存,主存中值的更新会使缓存中的值失效(非volatile变量不具备这样的特性,非volatile变量的值会被缓存,线程A更新了这个值,线程B读取这个变量的值时可能读到的...原创 2020-02-13 12:24:59 · 125 阅读 · 0 评论 -
Java内存模型中的happens-before原则
先行发生原则(Happens-Before)是判断数据是否存在竞争、线程是否安全的主要依据。先行发生是Java内存,模型中定义的两项操作之间的偏序关系,如果操作A先行发生于操作B,那么操作A产生的影响能够被操作B观察到。口诀:如果两个操作之间具有happen-before关系,那么前一个操作的结果就会对后面的一个操作可见。是Java内存模型中定义的两个操作之间的偏序关系。常见的happ...原创 2020-02-13 10:32:46 · 234 阅读 · 0 评论 -
HashMap为什么是线程不安全的?
1.多线程下进行put操作的时候导致的数据不一致。当有多个线程进行put操作时,第一个线程已经计算完放值的桶索引坐标,此时轮到第二个线程,第二个线程成功地把记录插入到桶里面,然而两个线程计算出来的桶索引是一样的,然后第一个线程就会继续往原先的桶索引插值,就覆盖了第二个线程的记录。2.可能因为resize(扩容)而引起死循环。HashMap的扩容机制就是重新申请一个容量是当前的2倍的桶数组...原创 2020-02-13 10:24:54 · 340 阅读 · 0 评论 -
ConCurrentHashMap
ConcurrentHashMap使用了锁分段技术来提供更高的并发性和伸缩性。锁分段技术就是说容器里有多把锁,每一把锁用于锁容器其中一部分数据,当多线程访容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效提高并发效率。在CurrentHashMap中,首先将数据分成一段一段的存储,然后给每段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。可重...转载 2020-02-13 10:19:16 · 209 阅读 · 0 评论 -
Thread启动线程start()和run()方法的区别
运行效果两者都可以触发线程执行。但run会立即同步执行、start异步执行。1、start():用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到CPU时间片,就开始执行run()方法,这里方法run()称为线程...原创 2020-02-13 10:06:30 · 591 阅读 · 0 评论 -
Java中线程安全的容器
同步容器类:使用了synchronized1.Vector2.HashTable并发容器:3.ConcurrentHashMap:分段4.CopyOnWriteArrayList:写时复制5.CopyOnWriteArraySet:写时复制Queue:6.ConcurrentLinkedQueue:是使用非阻塞的方式实现的基于链接节点的无界的线程安全队列,性能非常好。(java...转载 2020-02-13 10:06:10 · 243 阅读 · 0 评论 -
Java对象的内存布局
对象的内存布局包括三个部分:对象头(Header),实例数据(Instance Data)和对齐填充(Padding)。对象头:对象头包括两部分信息,第一部分是存储对象自身的运行时数据,如哈希码(HashCode)、GC 分代年龄、锁状态标志、线程持有的锁、偏向线程 ID、偏向时间戳、对象分代年龄,这部分信息称为“Mark Word”;Mark Word 被设计成一个非固定的数据结构以便在极小...原创 2020-02-13 10:06:02 · 106 阅读 · 0 评论 -
什么是线程安全?
线程安全就是在多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,使其他线程不能进行访问。直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。...原创 2020-02-13 10:05:50 · 286 阅读 · 0 评论 -
进程的异步与同步、IO的异步与同步
一、进程的同步异步:在多道程序环境下,当程序并发执行时,由于他们之间会资源共享和进程合作,然后会让同处于一个系统中的各个进程之间可能存在以下两种形式的制约关系:直接制约关系和间接制约关系。直接制约关系:这种制约主要源于进程间的合作。例如,有一输入进程A通过单缓冲向进程B提供数据。当该缓冲为空时,计算进程因不能获得所需数据而阻塞,而当进程A把数据输入缓冲区后,便将进程B唤醒;反之,当缓冲区已...原创 2020-02-12 11:45:37 · 572 阅读 · 0 评论 -
volatile和synchronized的区别
1.volatile本质是在告诉JVM当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取。synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。2.volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别。3.volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的...原创 2020-02-12 11:30:15 · 126 阅读 · 0 评论 -
Java实现线程同步的方式
1.使用同步方法,即有synchronized关键字修饰的方法。2.使用同步代码块,即有synchronized关键字修饰的语句块。3.使用特殊域变量(volatile)实现线程同步。4.使用互斥锁ReentrantLock实现线程同步。5.使用局部变量实现线程同步。如果使用ThreadLocal管理变量,则每一个使用该变量的线程都获得该变量的副本,副本之间相互独立,这样每一个线程...原创 2020-02-12 11:10:56 · 112 阅读 · 0 评论 -
ConcurrentHashMap的锁分段技术、扩容
什么是锁分段技术?ConcurrentHashMap是使用的锁分段技术,锁分段技术就是说容器里有多把锁,每一把锁用于锁容器其中一部分数据,多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率。然后在ConcurrentHashMap中,它首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线...原创 2020-02-12 10:57:22 · 1667 阅读 · 0 评论