首页 > 编程语言 >Java面试-基础篇之5

Java面试-基础篇之5

时间:2023-03-23 21:00:18浏览次数:55  
标签:Java synchronized 基础 面试 线程 自旋 修饰 重量级

说一说synchronized关键字

synchronized是java语言中的一个关键字,如同public、private、trycatch等可以在Java中直接被编译器识别的具有功能性的单词。

synchronized中文意思是同步的,也表示它在Java中主要负责的是多个线程之间资源的同步性。被它修饰过的方法或者代码块或是资源可以保证在执行过程中任意时刻只有一个线程执行。

Java6版本之前的synchronized属于重量级锁。使用互斥量mutex来实现同步锁的功能。
在synchronized有3种锁的形态,synchronized首先是一个偏向锁。偏向锁指的是当一个线程一直访问一段同步代码时,那么下次线程想要获取锁时,优先级是最高的,这个线程会一直占有这个锁。这就叫偏向锁。

而其他获取不到锁的线程就会通过自旋的方式尝试获取锁,这时候锁就会升级,升级为轻量级锁。当锁已经升级为轻量级锁后,其他线程自旋到一定时间后仍然获取不到锁时,线程就会阻塞,该锁膨胀为重量级锁。

总体来说,重量级锁是会阻塞的锁。一旦成为重量级锁,如果不是占有锁的线程,其他线程申请资源时,一律阻塞。

Java6以后,synchronized引入大量的优化,如自旋锁,适应性自旋锁,缩消除,锁粗化,偏向锁,轻量级锁等技术来减少锁操作的开销,这些优化使synchronized也可以在实际的使用中有更好的表现。

synchronized用法是修饰实例方法,修饰静态方法,修饰代码块。除了修饰静态方法是作用于所有对象实例外,另外两种修饰方法作用于当前对象实例类。

字符串常量池具有缓存功能,所以一般不用synchronized修饰。
synchronized原理是使用monitorenter和monitorexit指令来尝试获取monitor持有权。jvm中使用ObjectMonitor调用c++来实现。

标签:Java,synchronized,基础,面试,线程,自旋,修饰,重量级
From: https://www.cnblogs.com/stying/p/17246222.html

相关文章

  • Python基础
    列表方法用法案例字符串方法字典方法用法案例集合方法1方法2用法案例文件对象方法......
  • 【jmeter】启动报错Uncaught Exception java.lang.IllegalAccessError: class com.git
    1、问题  之前是java8的时候装的jmeter突然不能用了,报错UncaughtExceptionjava.lang.IllegalAccessError:classcom.github.weisj.darklaf.ui.filech...... 2、......
  • Java多线程之ExecutorCompletionService
    目录1ExecutorCompletionService1.1简介1.2原理1.3Demo示例1.3.1未使用ExecutorCompletionService1.3.2使用ExecutorCompletionService1.4深入分析说明1.4.1所有方......
  • java 类似datatable_java jdbc 得到像C#里的datatable一样的表格
    java类似datatable_javajdbc得到像C#里的datatable一样的表格https://blog.csdn.net/weixin_34079140/article/details/114602857publicArrayList>getDataTale2(S......
  • Nginx面试
    1Nginx负载均衡算法nginx的upstream目前支持4种方式的分配0)、轮询(默认)每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。1)、wei......
  • 【Java】关于Queue的用法总结
    【Java】关于Queue的用法总结原文链接:https://blog.csdn.net/qq_25353433/article/details/88016369之前对Queue只有一知半解,常用它的某几个方法,却不知道其中的区别,看了......
  • MySQL基础:事务
    MySQL基础:事务事务简介事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时......
  • linux shell基础--$字符
    shell中有两类字符:普通字符、元字符。普通字符在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本;元字符是Shell的保留字符,在Shell中有着特殊的含义。$()反引号......
  • 关于java的快速输入的一点小bug
    在java打算法题的时候,Scanner类、Sout的速度太慢,所以要用PrintWriter和BufferReader&StreamTokenizer类来进行快速输入。代码如下:importjava.io.*;publicclassMain......
  • 学习记录-JAVA正则表达式
    正则表达式java匹配方法s.matches("JAVA");s.equals("JAVA");来询问该字符串是否匹配表达式正则表达式语法整行字符加上/表示为正则表达式/123/以下所有均省略//......