总结java中的synchronized锁

目录

synchronized的特性

synchronized的锁机制

synchronized的使用


synchronized的特性

  synchronized主要有三大特性:

  面试时经常拿synchronized关键字和volatile关键字的特性进行对比,synchronized关键字可以保证并发编程的三大特性:原子性、可见性、有序性,而volatile关键字只能保证可见性和有序性,不能保证原子性,也称为是轻量级的synchronized

  • 原子性:一个或多个操作要么全部执行成功,要么全部执行失败。synchronized关键字可以保证只有一个线程拿到锁,访问共享资源。
  • 可见性:当一个线程对共享变量进行修改后,其他线程可以立刻看到。执行synchronized时,会对应执行 lockunlock原子操作,保证可见性。
  • 有序性:程序的执行顺序会按照代码的先后顺序执行。

synchronized的锁机制

  synchronized既是悲观锁,也是乐观锁,既是轻量级锁,也是重量级锁。可重入锁,不是读写锁,是非公平锁。至于上述名词的意思,可以浏览这篇文章CSDN

synchronized的“自适应”是根据当前锁冲突的概率来调整锁策略。调整的过程分为以下阶段:

偏向锁:首次使用synchronized对对象进行加锁的时候,不是真的加锁。而只是做一个“标记”(非常轻量非常快,几乎没有开销)。如果没有别的线程尝试对这个对象加锁,就可以保持这个暧昧状态,一直到解锁。(解锁也就是修改一下上述标记,也几乎没有开销)上述过程,就相当于没有任何的加锁操作,速度是非常快的,也可以保证锁能够正常生效。但是,如果再偏向锁状态下,有某个线程也尝试来对这个对象加锁,立马把偏向锁升级成轻量级锁(真的有锁,真的有互斥了)

上述升级过程,针对一个锁对象来说,是不可逆的。一旦升级成了重量级锁,不会退回到轻量级锁。

synchronized的使用

synchronized主要有三种使用方式:修饰普通同步方法修饰静态同步方法修饰同步方法块

修饰普通同步方法

我们看下列代码:

public class ThreadDemo9 {private static int count;public static void main(String[] args) throws InterruptedException {Object locker = new Object();Thread t1 = new Thread(()->{for (int i = 0; i < 10000; i++) {synchronized (locker){count++;}}});Thread t2 = new Thread(()->{for (int i = 0; i < 10000; i++) {synchronized (locker){count++;}}});t1.start();t2.start();t1.join();t2.join();System.out.println("count = " + count);}
}

运行结果:

这就是使用synchronized保证线程安全,解决内存可见性问题的典型用法。关于内存可见性的详情,可以浏览这篇文章CSDN

修饰静态同步方法

示例代码如下:

class syncTest implements Runnable {​private static int i = 0;   //共享资源​private static synchronized void add() {i++;}​@Overridepublic void run() {for (int j = 0; j < 10000; j++) {add();}}​public static void main(String[] args) throws Exception {​//        syncTest syncTest = new syncTest();​Thread t1 = new Thread(new syncTest());Thread t2 = new Thread(new syncTest());​t1.start();t2.start();​t1.join();t2.join();​System.out.println(i);}}

运行结果为:

20000

即当synchronized作用于静态方法add(),锁就是当前的class对象

修饰同步方法块

如果某些情况下,整个方法体比较大,需要同步的代码只是一小部分,如果直接对整个方法体进行同步,会使得代码性能变差,这时只需要对一小部分代码进行同步即可。代码如下:

class syncTest implements Runnable {​static int i = 0;   //共享资源​@Overridepublic void run() {//其他操作.......synchronized (this){   //this表示当前对象实例,这里还可以使用syncTest.class,表示class对象锁for (int j = 0; j < 10000; j++) {i++;}}​}​public static void main(String[] args) throws Exception {​syncTest syncTest = new syncTest();​Thread t1 = new Thread(syncTest);Thread t2 = new Thread(syncTest);​t1.start();t2.start();​t1.join();t2.join();​System.out.println(i);}}

输出结果:

20000

以上,关于synchronized希望对你有帮助。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/620270.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolo系列(之一)

深度学习经典检测算法 two-stage (两阶段) : Faster-rcnn Mask-Rcnn系列 &#xff08;输入图像---》CNN特征---》预选框---》输出结果&#xff09; one-stage (单阶段): YOLO系列 &#xff08;输入图像---》CNN特征---》输出结果&#xff09; one-stage的特点&#xff1a;&…

python计算

优先级&#xff1a;小括号&#xff08;&#xff09;>幂运算&#xff08;指数&#xff09;>正负号>算术运算&#xff08;先乘除后加减&#xff09;>比较运算>逻辑运算

网络基础(二)——传输层

1、再谈端口号 端口号(Port)标识了一个主机上进行通信的不同的应用程序; 在TCP/IP协议中, 用 "源IP", "源端口号", "目的IP", "目的端口号", "协议号" 这样一个五元组来标识一个通信(可以通过 netstat -n查看); 1.1、端口号…

【详细讲解下Photoshop】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

第十五届蓝桥杯c++b组赛后复盘和真题展示

题目变成八道了&#xff0c;分数一百分可能&#xff0c;感觉拿奖难度还是很高 第一题是一个简单的握手问题 答案算出来1204&#xff0c;纯手写 第二题是 物理题 纯蒙&#xff0c;随便猜了个轨迹&#xff0c;答案具体忘了&#xff0c;最后是 .45 第三题暴力 第四题 我是傻逼…

jenkins 宝塔部署及集成到码云自动构建代码

jenkins 宝塔部署及集成到码云自动构建代码 ps:本文所有涉及软件包一键下载 一、Jenkins包下载 大家可以从Jenkins官网(https://www.jenkins.io/)根据自己的需要下载最新的版本。 但Jenkins官网下载较慢,容易造成下载失败。可以去国内的开源镜像网站下载Jenkins最新版本。…

揭秘!这些部门对六西格玛技术情有独钟

当下&#xff0c;企业为了提升产品质量、降低成本、提高效率&#xff0c;纷纷寻求先进的管理方法和技术手段。其中&#xff0c;六西格玛技术因其卓越的绩效改善能力&#xff0c;受到了众多企业的青睐。那么&#xff0c;哪些部门对六西格玛技术情有独钟呢&#xff1f;天行健六西…

城市建筑渣土车智慧管理,让城市更智能!

在这个充满高楼林立的城市&#xff0c;建筑业已经成为了城市发展的重要支柱。而随之而来的&#xff0c;就是大量的建筑渣土需要清运。在这个过程中&#xff0c;渣土车成为了不可或缺的角色。 然而&#xff0c;渣土车管理却成为了一个难题。由于管理不善&#xff0c;很多渣土车不…

消息队列RabbitMQ入门学习

目录 1.初识MQ 1.1.同步调用 1.2.异步调用 1.3.技术选型 2.RabbitMQ 2.1.收发消息 2.1.1.交换机 2.1.2.队列 2.1.3.绑定关系 2.1.4.发送消息 3.SpringAMQP 3.1WorkQueues模型 3.1.1消息接收 3.1.2测试 3.1.3.能者多劳 3.1.3.总结 3.2.交换机类型 3.3.Fanout交…

JavaScript-2.对话框、函数、数组、Date、DOM

对话框 window对象封装了三个对话框用于与用户交互 提示框&#xff1a;alert(title);确认框&#xff1a;confirm(title);输入框&#xff1a;prompt(title); 确认框 包含两个按钮“确认”/“取消”&#xff0c;点击确定时&#xff0c;返回值为true // 确认框 var bool con…

5.Godot节点和功能及Node节点属性分析

1. 节点和功能的关系 节点 Node &#xff0c;用于实现一种功能&#xff0c;例如&#xff0c;Sprite 节点&#xff0c;用于图片的显示一个节点的功能取决于它挂载了哪些子节点&#xff0c;它包含了哪些功能的子节点&#xff0c;就包含了对应子节点表示的功能节点是可选的&#…

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析

原文链接&#xff1a;基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601336&idx4&sn143be5669da8ad336a455a4cca3d4b6a&chksmfa820d5fcdf584491…