synchronized

ReentrantLock和synchronized总结

人走茶凉 提交于 2020-03-09 10:00:25
一、简介 ReentrantLock常常对比着synchronized来分析,我们先对比着来看然后再一点一点分析。 (1)synchronized是独占锁,加锁和解锁的过程自动进行,易于操作,但不够灵活。ReentrantLock也是独占锁,加锁和解锁的过程需要手动进行,不易操作,但非常灵活。 (2)synchronized可重入,因为加锁和解锁自动进行,不必担心最后是否释放锁;ReentrantLock也可重入,但加锁和解锁需要手动进行,且次数需一样,否则其他线程无法获得锁。 (3)synchronized不可响应中断,一个线程获取不到锁就一直等着;ReentrantLock可以相应中断。 ReentrantLock好像比synchronized关键字没好太多,我们再去看看synchronized所没有的,一个最主要的就是ReentrantLock还可以实现公平锁机制。什么叫公平锁呢?也就是在锁上等待时间最长的线程将获得锁的使用权。通俗的理解就是谁排队时间最长谁先执行获取锁。 二: ReentrantLock相比synchronized的额外功能 公平锁是指当锁可用时,在锁上等待时间最长的线程将获得锁的使用权。而非公平锁则随机分配这种使用权。和synchronized一样,默认的ReentrantLock实现是非公平锁,因为相比公平锁,非公平锁性能更好。当然公平锁能防止饥饿

JUC -多线程锁问题:

懵懂的女人 提交于 2020-03-09 06:25:24
多线程锁问题: 8锁现象下名词解释: 顺序执行:先调用的先执行 随机执行:没有规律,与计算机硬件资源有关,哪个线程先得到资源就先执行,各个线程之间互不干扰。 多个线程使用同一把锁- 顺序执行 多个线程使用同一个对象,多个线程就是使用一把锁,先调用的先执行! public class MultiThreadUseOneLock01 { public static void main ( String [ ] args ) { Mobile mobile = new Mobile ( ) ; // 两个线程使用的是同一个对象。两个线程是一把锁!先调用的先执行! new Thread ( ( ) - > mobile . sendEmail ( ) , "A" ) . start ( ) ; // 干扰 try { TimeUnit . SECONDS . sleep ( 1 ) ; } catch ( InterruptedException e ) { e . printStackTrace ( ) ; } new Thread ( ( ) - > mobile . sendMS ( ) , "B" ) . start ( ) ; } } // 手机,发短信,发邮件 class Mobile { // 被 synchronized 修饰的方法、锁的对象是方法的调用者、 public

Java多线程系列--“JUC原子类”02之 AtomicLong原子类

耗尽温柔 提交于 2020-03-09 05:38:33
什么是线程安全? 当多个线程访问某个类时,不管这些的线程的执行顺序如何,并且在主调代码中不需要任何额外的同步或协同,这个类都能表现出正确的行为,那么就称这个类是线程安全的。 哈哈书上的解释,还是翻译过来的,看了半天还是觉得有点奇怪。比如说 “类都能表现出正确的行为” 是毛线意思?在网上搜了一番 "线程安全就是说多线程访问同一代码,不会产生不确定的结果" 这样反而跟容易理解,果然读书要么读原版中文书要么读原版英文书,看英文的翻译版真的是蛋疼无比。说到这里,我以前貌似把多线程及线程安全一个根本性问题搞混淆了: 所谓的多线程是指多个线程跑同一段代码,所以线程安全的概念是针对于这段代码而言的而不是针对线程。 一个 无状态 的Servlet //程序清单2-1 一个无状态的Servelet @ThreadSafe public class StatelessFactorizer implements Servlet{ public void service(ServlerRequest req, ServletResponse resp){ BigInteger i = extractFromRequest(req); BigInteger[] factors = factor(i); encodeIntoResponse(resp, factors); } }

JUC - Synchronized 和 Lock 的区别

最后都变了- 提交于 2020-03-08 22:07:15
JUC - Synchronized 和 Lock 的区别 面试题:Synchronized 和 Lock 有什么区别? 用新的 Lock 有什么好处?你举例说说。 1,原始构成 synchronized 是关键字属于JVM层面, monitorenter 底层是通过 monitorenter 对象来完成,其实 wait/notify 等方法也依赖于 monitor 对象只有在同步块或方法中才能调 wait/notify 等方法 monitorexit 退出,下图中有两个 monitorexit,第一个是正常退出,第二个是即使报错了也可以退出。 Lock 是具体的类(java.util.concurrent.locks.lock) 是 api 层面的锁 2,使用方法 synchronized 不需要用户去手动释放锁,当 synchronized 代码块执行完后系统会自动让线程释放对锁的占用 ReentractLock 需要用户去手动释放锁,若没有主动释放锁,就有可能导致出现死锁现象。 需要lock() 和 unLock() 方法配合 try/finally 语句块来完成 3,等待是否可中断 synchronized 不可中断,除非抛出异常或者正常运行完成 ReenterantLock 可中断: 1,设置超时方法 tryLock(long timeout,TimeUnit unit)

面试之线程相关

不想你离开。 提交于 2020-03-08 16:45:25
面试之线程相关 1.什么是进程? 1.进程是系统中正在运行的一个程序,程序一旦运行就是进程。 2.进程可以看做程序执行的一个实例,进程是系统资源分配的独立实体,每个进程都拥有独立的地址空间。一个进程无法访问另一个进程的变量和数据结构,如果想让一个进程访问另一个进程的资源,需要使用进程间的通信,比如管道,文件,套接字 3.一个进程可以拥有多个线程,每个线程使用所属进程的栈空间。同一进程内多个线程会共享部分状态,多个线程可以读写一块内存。同时每一个线程还拥有自己的寄存器和栈,其他线程可以读写这些栈内存。 2.什么是线程? 1.线程是操作系统能够进行运算调度的最小单位。 2.线程是进程的一个实体,是进程的一条执行路径,当一个线程修改了资源,他的兄弟线程可以立即看到这种变化。 3.并发和并行和串行 1.并行指在同一时刻,有多条指令在多个处理器上同时执行;而并发是指两个或多个事件在同一时间间隔(宏观上)发生。 2.并行是在不同实体的多个事件,并发是在同一实体的多个事件 3.并发是指一个处理器同时处理多个任务。并行是指多个处理器或者是多核的处理器同时处理多个不同的任务。 4 并发(concurrency):指在同一时刻只能有一条指令执行,但多个进程指令被快速的轮换执行,使得在宏观上具有多个进程同时执行的效果,但在微观上并不是同时执行的,只是把时间分成若干段,使多个进程快速交替的执行 5.串行

[JUC第一天]浅谈volatile关键字

馋奶兔 提交于 2020-03-08 10:09:38
文章目录 概述 可见性 为什么有时会不可见 如何解决 防止重排序 一个有趣的例子 重排序会导致什么 内存屏障 原子性 什么是原子性 volatile变量不具有原子性 概述 在Java语言规范第三版中, volatile 关键词的定义如下: Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地使用和更新,线程应该确保通过排他锁单独获得这个变量 并发编程中有两个很常见的关键词: synchronized 和 volatile volatile 可以用来修饰一个变量,使得并发情况下所有线程得到这个对象的值都是一样的 相比与 synchronized 操作会找个东西当锁, volatile 则是通过实时共享变量的值的方式来保证变量的可见性的,而并没有锁什么东西,所以说他的使用并不会引起程序的上下文切换,所以也说,volatile是轻量级的synchronized volatile最大的两个特点就是: 使得内存模型中所有线程获取到的值都是统一的(可见性) 避免指令在执行的时候因为优化机制重排序而出错 可见性 内存可见性 :每一个工作线程看到的某个变量的值都是相同的,而且是他最新的状态 为什么有时会不可见 这首先就要从计算机的缓存说起了: 很久以前,计算机的CPU和内存是直接连着的,但是这样导致的是传输速度跟不上CPU的运算速度 后来的计算机中通过设置缓存的方式

SynchronizedMap

对着背影说爱祢 提交于 2020-03-08 10:07:57
引入了mutex互斥锁,其他的都是调用的map方法 private static class SynchronizedMap<K,V> implements Map<K,V>, Serializable { private static final long serialVersionUID = 1978198479659022715L; private final Map<K,V> m; // Backing Map final Object mutex; // Object on which to synchronize SynchronizedMap(Map<K,V> m) { this.m = Objects.requireNonNull(m); mutex = this; } SynchronizedMap(Map<K,V> m, Object mutex) { this.m = m; this.mutex = mutex; } public int size() { synchronized (mutex) {return m.size();} } public boolean isEmpty() { synchronized (mutex) {return m.isEmpty();} } public boolean containsKey(Object key) {

java锁学习

為{幸葍}努か 提交于 2020-03-08 08:04:38
锁从设计理念上可分为2类,分别为悲观锁(互斥锁)和乐观锁(非互斥锁) 悲观锁适用于写多读少的场景,乐观锁适用于读多写少的场景 java中的悲观锁就是Synchronized,AQS框架下的锁则是先尝试cas乐观锁去获取锁,获取不到,才会转换为悲观锁,如RetreenLock。 java中主要锁有2种实现方式,分别是jvm虚拟机实现的(Synchronized关键字)和JDK 代码实现的(Lock接口实现等java.util.concurrent.locks包下的锁) Synchronized实现的锁是一种互斥锁(一次最多只能有一个线程持有的锁,当一个线程持有该锁的时候其它线程无法进入上锁的区域),它是一种悲观锁 synchronized最早只有重量级锁,在jdk1.6中对Synchronized进行了优化。 在编译器层面,使用了锁消除(对一些没有必要的、不会引起安全问题的同步代码取消同步)和锁粗化(对那些多次执行同步的代码且它们可以可并到一次同步的代码) 同时引进了适应性自旋锁,偏向锁,轻量级锁,这3种锁属于乐观锁。 jdk1.6中是默认开启偏向锁和轻量级锁的 Java SE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。 锁可以升级但不能降级,这种锁升级却不能降级的策略,目的是为了提高获得锁和释放锁的效率。 偏向锁:(Mark

多线程(三)-- 线程安全问题

社会主义新天地 提交于 2020-03-08 07:53:13
安全解决 -- 互斥锁 @synchronized(self) { //开始加锁,操作 } 优: 解决多线程抢夺资源产生的数据安全问题 缺: 消耗CPU资源多 使用前提: 多条线程执行一块代码时加锁 线程同步:@synchronized() 多条线程在同一条线上执行(按顺序执行,与线程并发不同) nonatomic 与 atomic atomic保护线程安全,自动加锁 为setter加锁 对比 atomic:线程安全,消耗大量资源 nonatomic:非线程安全,适合内存小的移动设备 来源: https://www.cnblogs.com/fangchun/p/4684910.html

23种设计模式

删除回忆录丶 提交于 2020-03-08 04:28:39
设计模式(Design Patterns) ——可复用面向对象软件的基础 设计模式(Design pattern)是一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性。 毫无疑问,设计模式于己于他人于系统都是多赢的,设计模式使代码编制真正工程化,设计模式是软件工程的基石,如同大厦的一块块砖石一样。项目中合理的运用设计模式可以完美的解决很多问题,每种模式在现在中都有相应的原理来与之对应,每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的核心解决方案,这也是它能被广泛应用的原因。本章系 Java之美[从菜鸟到高手演变]系列 之设计模式,我们会以理论与实践相结合的方式来进行本章的学习,希望广大程序爱好者,学好设计模式,做一个优秀的软件工程师! 企业级项目实战(带源码)地址 : http://zz563143188.iteye.com/blog/1825168 23种模式java实现源码下载地址 http://pan.baidu.com/share/link?shareid=372668&uk=4076915866#dir/path=%2F%E5%AD%A6%E4%B9%A0%E6%96%87%E4%BB%B6 一、设计模式的分类 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式