`

面试-java锁--synchronized

 
阅读更多

面试-java锁--synchronized

 

0、synchronized  隐式锁

 

1、锁的目的:控制并发,防止多线程修改数据出问题。

 

2、最简单的 -- synchronized

 

2.1 Monitor

            Java虚拟机给每个对象和class字节码都设置了一个监听器Monitor。

              

  

  

 

           

    Synchronized经过编译,会在同步块的前后分别形成monitorenter和monitorexit这个两个字节码指令。

    在执行monitorenter指令时,首先要尝试获取对象锁。

    如果这个对象没被锁定,或者当前线程已经拥有了那个对象锁,把锁的计算器加1,

    相应的,在执行monitorexit指令时会将锁计算器就减1,当计算器为0时,锁就被释放了。

    如果获取对象锁失败,那当前线程就要阻塞,直到对象锁被另一个线程释放为止。

 

  问题或特性:

          1、不能中断

                   事实上线程的中断操作对于正在等待获取的锁对象的synchronized方法或者代码块并不起作用,

                也就是对于synchronized来说,如果一个线程在等待锁,那么结果只有两种,

                要么它获得这把锁继续执行,要么它就保持等待,即使调用中断线程的方法,也不会生效

           

           2、非公平

                获取不到锁的时候,会自动加入队列,等待线程释放锁后所有等待的线程同时去竞争

 

          3、无法设置超时

 

          4、随机唤醒一个线程要么唤醒全部线程

 

          5、jdk 1.6的优化前 性能较低:

                        Synchronized是通过对象内部的一个叫做监视器锁(monitor)来实现的。

                          但是监视器锁本质又是依赖于底层的操作系统的Mutex Lock(操作系统的互斥锁)来实现的。

                          而操作系统实现线程之间的切换这就需要从用户态转换到核心态,这个成本非常高,

                         状态之间的转换需要相对比较长的时间,这就是为什么Synchronized效率低的原因。

                         因此,这种依赖于操作系统Mutex Lock所实现的锁我们称之为“重量级锁”。

 

  • 大小: 84.5 KB
分享到:
评论

相关推荐

    java面试题-java-interview-questions-master.zip

    java面试题_java-interview-questions-master.zip2、在 Java 程序中怎么保证多线程的运行安全? 出现线程安全问题的原因一般都是三个原因: 1、 线程切换带来的原子性问题 解决办法:使用多线程之间同步...

    java并发锁面试知识

    java中的乐观锁与悲观锁,synchronized与ReentrantLock重入锁的说明与比较

    【Java面试题】lock与synchronized区别

    【Java面试题】lock与synchronized区别

    Java面试宝典-经典

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

    Java面试题.docx

    46、谈谈对Synchronized关键字,类锁,方法锁,重入锁的理解 49、synchronized 和volatile 关键字的区别 51-58题 51、ReentrantLock 、synchronized和volatile比较 53、死锁的四个必要条件? 56、什么是线程池...

    java--面试题大全(附答案

    String和StringBuilder、...StringBuilder是Java 5中引入的,它和StringBuffer的方法完全相同,区别在于它是在单线程环境下使用的,因为它的所有方面都没有被synchronized修饰,因此它的效率也比StringBuffer要高。

    java并发编程面试题

    java并发编程 基础知识,守护线程与线程, 并行和并发有什么区别? 什么是上下文切换?...ReentrantLock(重入锁)实现原理与公平锁非公平锁区别什么是可重入锁(ReentrantLock)? ThreadLocal内存泄漏分析与

    java面试800题

    《java面试800题(包括java,数据库,前台等,绝对全面)》 Q0027 哪些SQL语句在执行时是自动提交的? 数据定义语言DDL是自动提交的。 Q0028 索引对数据库的影响? 提高查询速度 Q0029 主外键有什么关系? 外键是从...

    JAVA面试必成功之JAVA面试秘籍

    JAVA面试秘籍一份通向理想互联网公司的面试汇总,包括Java基础、Java并发、JVM、MySQL、Redis、Spring、MyBatis、Kafka、计算机操作系统、计算机网络、系统设计、分布式、Java项目实战等。Java多线程,包括多线程...

    Java常见面试题208道.docx

    面试题包括以下十九部分:Java 基础、容器、多线程、反射、对象拷贝、Java Web 模块、异常、网络、设计模式、Spring/Spring MVC、Spring Boot/Spring Cloud、Hibernate、Mybatis、RabbitMQ、Kafka、Zookeeper、MySql...

    JAVA面试题最全集

    简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34.EJB规范规定EJB中禁止的操作有哪些? 35.java除了8种基本类型外,在虚拟机里还有哪一种,有什么作用? 36.除了使用new关键字创建对象意外,试列举...

    Java服务器端开发面试.doc

    NIO(通道,缓冲区,选择器) Java服务器端开发面试题篇2 thread, start(), run() 多线程里面的关键字,wait, notfiy, 锁(synchronized), lock接口 线程状态,上下文切换,守护线程 消费者和生产者的几种实现方式,...

    Synchronized_锁升级知识点总结

    java高并发开发必须要会的知识,锁知识,关键字 Synchronized_锁升级知识点总结,面试常用

    各大公司Java后端开发面试题总结.pdf

    内容概要:涵盖各大公司Java后端开发面试的常见考点,例如:Java内存模型、java GC、Synchronized 与Lock锁、java集合、线程池、Spring的IOC等等。帮助你系统复习并掌握核心知识。 适用人群:Java后端开发工程师、...

    JAVA面试题 简谈你对synchronized关键字的理解

    主要介绍了JAVA面试题 请谈谈你对Sychronized关键字的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集.zip

    java面试笔试资料包括JAVA基础核心知识点深度学习Spring面试题等资料合集: JAVA核心知识点整理-282页 Java与哈希算法.docx Java中Lambda表达式的使用.docx JAVA多线程之线程间的通信方式.docx Java注解详解.docx ...

    synchronized深度解析-课堂笔记

    该内容是在暮课网学习的课程比较,讲解synchronized的原理和用法,以及常见的面试题。上传网上以供自己以后复习。

    并发编程面试题.pdf

    Synchronized相关问题 问题一:Synchronized用过吗,其原理是什么? 问 题 二 : 你 刚 才 提 ...问 题 四 : JVM 对 Java 的 原 生 锁 做 了 哪 些 优 化 ? 问 题 五 : 为 什 么 说 Synchronized 是 非 公 平 锁 ?

    20道JAVA面试题.docx

    20道JAVA面试题 1、Java中的包是什么? 2、Java中的访问修饰符有哪些?它们的作用是什么? 3、Java中的final关键字有什么作用? 4、Java中的静态变量和实例变量有什么区别? 5、Java中的重载和重写有什么区别? 6、...

    Java面试宝典2010版

    54、简述synchronized和java.util.concurrent.locks.Lock的异同 ? 34 55、设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 36 56、子线程循环10次,接着主线程循环100,接着又回到...

Global site tag (gtag.js) - Google Analytics