synchronized

Java之synchronized的实现原理

独自空忆成欢 提交于 2020-03-29 11:24:05
0. 前言 目前在Java中存在两种锁机制:synchronized和Lock, Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea。本文并不比较synchronized与Lock孰优孰劣,只是介绍二者的实现原理。 数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现synchronized的? 本文所指说的JVM是指Hotspot的6u23版本,下面首先介绍synchronized的实现:synrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。 其应用层的语义是可以把任何一个非null对象作为"锁", 当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为Class数据存在于永久代,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。 在HotSpot JVM实现中,锁有个专门的名字:对象监视器。 1. 线程状态及状态转换 当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程: Contention

Java synchronized 关键字的实现原理

╄→尐↘猪︶ㄣ 提交于 2020-03-29 11:14:29
数据同步需要依赖锁,那锁的同步又依赖谁?synchronized给出的答案是在软件层面依赖JVM,而Lock给出的方案是在硬件层面依赖特殊的CPU指令,大家可能会进一步追问:JVM底层又是如何实现synchronized的? 本文所指说的JVM是指Hotspot的6u23版本,下面首先介绍synchronized的实现: synrhronized关键字简洁、清晰、语义明确,因此即使有了Lock接口,使用的还是非常广泛。其应用层的语义是可以把任何一个非null 对象 作为"锁",当synchronized作用在方法上时,锁住的便是对象实例(this);当作用在静态方法时锁住的便是对象对应的Class实例,因为 Class数据存在于永久带,因此静态方法锁相当于该类的一个全局锁;当synchronized作用于某一个对象实例时,锁住的便是对应的代码块。在 HotSpot JVM实现中,锁有个专门的名字:对象监视器。 1. 线程状态及状态转换 当多个线程同时请求某个对象监视器时,对象监视器会设置几种状态用来区分请求的线程: Contention List:所有请求锁的线程将被首先放置到该竞争队列 Entry List:Contention List中那些有资格成为候选人的线程被移到Entry List Wait Set:那些调用wait方法被阻塞的线程被放置到Wait Set OnDeck

java架构师学习讲解

你离开我真会死。 提交于 2020-03-29 07:32:22
一:并发编程 + activemq + 实战案例并发编程基础篇 第一天 1、课程大纲简要介绍 2、线程基础概念、线程安全概念、多个线程多个锁概念 3、对象锁的同步和异步 4、脏读概念、脏读业务场景、Synchronized概念、Synchronized代码块、Synchronized其他细节 微云学习地址:文件分享 网盘学习地址:https://pan.baidu.com/s/1CTx5SqUeM-ZKtDYLeovODQ 提取码:iclq 微云学习地址:文件分享 致学者:不论你在什么时候开始,重要的是开始之后请不要停止。 第二天 1、Volatile关键字概念、线程优化执行流程、内部原理讲解 2、Volatile关键字的非原子性 3、并发编程下的多线程间通信概念wait、notify,线程经典面试题讲解 4、模拟底层阻塞队列(queue)实现讲解 5、单例和多线程如何结合使用并发编程中级篇 第三天 1、同步类容器讲解 2、并发类容器讲解 3、Concurrent集合类讲解与底层原理实现 4、CopyOnWrite集合类讲解与底层原理实现 5、各类并发Queue详细讲解 第四天 1、多线程设计模式之Future模式讲解与模拟实现 2、多线程设计模式之Master-Worker模式讲解与模拟实现 3、多线程设计模式之生产消费者模型讲解与模拟实现并发编程高级篇 第五天 1

java 同步函数

拜拜、爱过 提交于 2020-03-28 20:40:11
1.明确哪些代码是多线程代。 2.明确共享数据。 3.明确多线程运行代码中哪些语句是操作共享数据的。 synchronized作为修饰符放函数上。同步函数使用的锁是:this验证:开启两个线程,一个同步代码块,一个同步函数。 class Ticket implements Runnable { private int tick = 100; boolean flag = true; @Override public void run() { if (flag) { while (true) { synchronized (this) { if (tick > 0) { try { Thread.sleep(10); } catch (InterruptedException e) { } System.out.println(Thread.currentThread().getName() + "...code:" + tick--); } } } }else while (true) show(); } public synchronized void show() { if (tick > 0) { try { Thread.sleep(10); } catch (InterruptedException e) { } System.out.println(Thread

并发编程相关面试题四

倖福魔咒の 提交于 2020-03-28 12:34:17
一、Java开发中用过哪些锁 1、乐观锁   乐观锁顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(Compare and Swap 比较并交换)实现的   乐观锁适合读操作非常多的场景,不加锁会带来大量的性能提升;     乐观锁在Java中的使用,是无锁编程,常常采用的是CAS算法,典型的例子就是原子类,通过CAS自旋实现原子操作的更新。 2、悲观锁   悲观锁总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁。比如Java里面的同步原语synchronized关键字的实现就是悲观锁。   悲观锁适合写操作非常多的场景;   悲观锁在Java中的使用,就是利用各种锁; 3、独享锁   独享锁是指该锁一次只能被一个线程所持有。   独享锁通过AQS来实现的,通过实现不同的方法,来实现独享锁。   对于Synchronized而言,当然是独享锁。 4、共享锁   共享锁是指该锁可被多个线程所持有。  

synchronized与ReentrantLock区别

删除回忆录丶 提交于 2020-03-28 10:54:52
synchronized与ReentrantLock都是 可重入锁 ,区别两者之前,先介绍可重入锁的概念。 可重入锁 同一个线程可以在对象锁还没释放时,可再次获取这个对象的锁。同一个线程每次获取锁,锁的计数器加1,释放一次锁,计数器减1,直到计数器为0,完全释放锁。 synchronized与ReentrantLock区别 ReentrantLock是一个类,使用灵活,必须配合释放锁 ReentrantLock手动获取或释放锁 ReentrantLock只适用代码块锁,synchronized不仅适合代码块,也适用类、变量 锁机制不一样。ReentrantLock调用Unsafe的park加锁,synchronized使用对象mark word 顺便提一下synchronized作用不同,它对应锁的是什么? 普通方法:锁当前实例 静态方法:锁当前类的class对象 方法块:锁括号里的对象 来源: https://www.cnblogs.com/ivy-xu/p/12586140.html

Java 多线程(六) synchronized关键字详解

你。 提交于 2020-03-28 07:32:23
Java 多线程(六) synchronized关键字详解   多线程的同步机制对资源进行加锁,使得在同一个时间,只有一个线程可以进行操作,同步用以解决多个线程同时访问时可能出现的问题。   同步机制可以使用 synchronized关键字 实现。    当synchronized关键字修饰一个方法的时候,该方法叫做 同步方法 。   当synchronized方法执行完或发生异常时,会自动释放锁。   下面通过一个例子来对synchronized关键字的用法进行解析。   1.是否使用synchronized关键字的不同 例子程序1   public class ThreadTest   {      public static void main(String[] args)     {       Example example = new Example();       Thread t1 = new Thread1(example);       Thread t2 = new Thread1(example);       t1.start();       t2.start();     }   }   class Example   {      public synchronized void execute()     {        for ( int i

java synchronized 线程同步机制详解

ⅰ亾dé卋堺 提交于 2020-03-28 07:27:50
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。 一、当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。 二、然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块。 三、尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞。 四、第三个例子同样适用其它同步代码块。也就是说,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁。结果,其它线程对该object对象所有同步代码部分的访问都被暂时阻塞。 五、以上规则对其它对象锁同样适用. 1.同步代码块,使用的锁可以是任意对象,但是操作共享资源时,锁必须唯一! 2.同步函数,使用的锁是this! 好处:解决线程的安全问题 缺点:都会判断同步锁,降低效率,同步函数设置在run函数上,会被某个线程一直占用

36.1 线程锁

流过昼夜 提交于 2020-03-28 07:25:25
一、没用锁之前出现的问题 package day34_thread_线程.线程锁; /* * t1,t2,t3 * 假设只剩一张票 * t1过来了,他一看有票,他就进来了,但是他突然肚子不舒服,然后他就去上卫生间了 * t2也过来了,他一看也有票,他也进来了,但是他的肚子也不舒服,他也去上卫生间了 * * t1上完了卫生间回来了,开始售票 * tickets = 0; * t2也上完卫生间回来了,他也进行售票 * tickets = -1; * * */ public class SleepThread implements Runnable { int nums = 20; @Override public void run() { // if(num > 0) { // for(int i=0;i<100;i++) { // System.out.println(Thread.currentThread().getName() + ":" + i); // } while(true) { if(nums > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName

Java关键字synchronized详解

偶尔善良 提交于 2020-03-28 07:21:04
Java 多线程 thread 互联网 制造 synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程A每次运行到这个方法时,都要检查有没有其它正在用这个方法的线程B(或者C D等),有的话要等正在使用这个方法的线程B(或者C D)运行完这个方法后再运行此线程A,没有的话,直接运行 它包括两种用法:synchronized 方法和 synchronized 块。 1. synchronized 方法:   通过在方法声明中加入 synchronized关键字来声明 synchronized 方法。如:   public synchronized void accessVal(int newVal);   synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方能执行,否则所属线程阻塞,方法一旦执行,就独占该锁,直到从该方法返回时才将锁释放,此后被阻塞的线程方能获得该锁,重新进入可执行状态。这种机制确保了同一时刻对于每一个类实例,其所有声明为 synchronized 的成员函数中至多只有一个处于可执行状态(因为至多只有一个能够获得该类实例对应的锁),从而有效避免了类成员变量的访问冲突(只要所有可能访问类成员变量的方法均被声明为 synchronized)。   在 Java 中