并发
NO0b
小白
展开
-
java join()基本用法与说明解释
join()方法的作用,是等待这个线程结束;也就是说,t.join()方法阻塞调用此方法的线程(calling thread)进入 TIMED_WAITING 状态,直到线程t完成,此线程再继续;通常用于在main()主线程内,等待其它线程完成再结束main()主线程。举个例子: public class JoinTester01 implements Runnable { ...原创 2018-11-28 22:03:30 · 60256 阅读 · 11 评论 -
单例模式 的 双重检查锁定 错在哪?
在Java多线程程序中,有时候需要采用延迟初始化来降低初始化类和创建对象的开销。双重检查锁定是常见的延迟初始化技术,但它是一个错误的用法。本文将分析双重检查锁定的错误根源 。双重检查锁定的由来在Java程序中,有时候可能需要推迟一些高开销的对象初始化操作,并且只有在使用这些对象时才进行初始化(单例)。此时程序员可能会采用延迟初始化。但要正确实现线程安全的延迟初始化需要一些技巧,否则很容易出...原创 2018-12-27 17:50:15 · 2139 阅读 · 0 评论 -
ConcurrentHashMap详解 ( JDK6,7,8 区别 )
线程不安全的HashMap因为多线程环境下,使用Hashmap进行put操作会引起死循环(导致CPU利用率接近100%), 数据丢失等情况 , HashMap是线程不安全的 ,所以在并发情况下不能使用HashMap。关于HashMap参考:https://blog.csdn.net/q5706503/article/details/85123141效率低下的HashTable容器...原创 2018-12-21 22:19:19 · 3007 阅读 · 0 评论 -
JAVA----静态方法上加锁 和 非静态方法加锁 区别
Synchronized修饰非静态方法,是对调用该方法的对象加锁,俗称“对象锁”。这里的对象加锁并非是说执行该加锁方法的时候整个对象的所有成员都不允许其他线程访问了,而是说该对象内所有的加锁的非静态方法共用这一把锁, 一个加锁非静态方法执行, 另一个加锁非静态方法不能执行,要等持有锁的线程释放锁, 不同对象之间的方法不互相作用这里举第一个例子:两个线程执行同一个对象的不同加锁非静态...原创 2018-12-14 00:24:15 · 8140 阅读 · 2 评论 -
通俗易懂happens-before理解
在JMM(JAVA内存模型)中,如果一个操作执行的结果需要对另一个操作可见,那么这两个操作之间必须存在happens-before关系。JMM可以通过happens-before关系向程序员提供跨线程的内存可见性保证(如果A线程的写操作a与B线程的读操作b之间存在happensbefore关系,尽管a操作和b操作在不同的线程中执行,但JMM向程序员保证a操作将对b操作可见)。 happen...原创 2018-12-13 23:02:28 · 4574 阅读 · 1 评论 -
为啥要指令重排序?
我们知道java在运行的时候有两个地方可能会把指令重排序,一个是编译器编译的的时候,一个是处理器运行的时候。那么为啥要用指令重排序呢?编译期重排序有啥好处?CPU计算的时候要访问值,如果常常利用到寄存器中已有的值就不用去内存读取了,比如说int a = 1;int b = 1;a = a + 1;b = b +1 ;就可能没有int a = 1;a = a ...原创 2018-12-12 22:54:24 · 2587 阅读 · 0 评论 -
Java多线程notify/notifyAll唤醒的是谁
涉及JAVA线程的状态问题, 不清楚的可以参考我的另一篇:https://blog.csdn.net/q5706503/article/details/84350887我们知道notify是Object的本地final方法,无法被重写, 用来唤醒线程, 那么该怎么用, 唤醒的又是谁呢?用一句话做答复 : notify唤醒的是其所在锁所阻塞的线程不理解看下面的分析和例子:wait...原创 2018-11-28 20:51:45 · 9366 阅读 · 9 评论 -
乐观锁和悲观锁
悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。再比如Java里面的同步原语synchronized关键字的实现也是悲观锁。JAVA中synchronized关键字:(CAS在下面介绍)Java并发...原创 2018-12-01 15:46:41 · 174 阅读 · 0 评论 -
CAS算法简介
CAS是什么?CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。CAS是乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新...原创 2018-11-28 16:14:24 · 15265 阅读 · 7 评论 -
Java并发编程----ThreadLocal详解
ThreadLocal是什么首先,它是一个数据结构,有点像HashMap,可以保存"key : value"键值对,但是一个ThreadLocal只能保存一个,并且各个线程的数据互不干扰。ThreadLocal用于保存某个线程共享变量:对于同一个static ThreadLocal,不同线程只能从中get,set,remove自己的变量,而不会影响其他线程的变量, 在高并发场景下,可以实现...原创 2019-01-03 14:19:03 · 2206 阅读 · 0 评论