导致线程安全的问题在于,存在多个线程2同时操作一个共享资源,需要解决这个问题,就需要保证对共享资源访问的独占性,因此人们在Java中提供了synchronized关键字,我们称之为同步锁,它可以保证在同一时刻,只允许一个线程执行某个方法或代码块。

synchronized同步锁具有互斥性,这相当于线程由并行执行变成串行执行,保证了线程的安全性,但损失了性能。

synchronized的使用方法

  • 作用在方法级别,表示针对m1()方法加锁,当多个线程同时访问m1()方法时,同一时刻只有一个线程能执行。
public synchronized void m1(){}
  • 作用在代码块级别,表示针对某一段线程不安全的代码加锁,只有访问到synchronized(this)这行代码时,才会去竞争锁资源。
public void m2(){synchronized(this){}
}

synchronized同步锁的作用范围

  • 类锁:类锁是全局锁,当多个线程调用不同对象实例的同步方法时会产生互斥。

    /**修饰静态方法*/public static synchronized void m1(){}/**修饰代码块,synchronized中的锁对象是类,也就是Lock.class*/
    public class Lock{public void m2(){synchronized(Lock.calss){}}
    }
    
  • 对象锁:对象锁是实例锁,当多个线程调用同一个对象实例的同步方法时会产生互斥。
//修饰普通方法
public synchronized void m1(){}//修饰代码块,synchronized中的锁对象是普通对象实例
public class Lock{Object lock = new Object();public void m2(){synchronized(lock){}}
}

Synchronized同步锁相关推荐

  1. Java多线程系列(六):深入详解Synchronized同步锁的底层实现

    谈到多线程就不得不谈到Synchronized,很多同学只会使用,缺不是很明白整个Synchronized的底层实现原理,这也是面试经常被问到的环节,比如: synchronized的底层实现原理 s ...

  2. java 同步锁_Java多线程:synchronized同步锁的使用和实现原理

    作用和用法 在多线程对共享资源进行并发访问方面,JDK提供了synchronized关键字来进行线程同步,实现多线程并发访问的线程安全.synchronized的作用主要体现在三个方面:(1)确保线程 ...

  3. Synchronized同步锁是如何实现的

    前言: 要想用好Synchronized锁,首先得了解清楚其实现同步锁的原理 原理解析 首先,看下其修饰代码块时: //关键字在代码块上,锁为括号里面的对象 public void method2() ...

  4. 一文搞懂Synchronized同步锁的作用范围

    文章目录 类锁 修饰静态方法 修饰代码块 实战演练 对象锁 修饰普通方法 修饰代码块 实战演练 分析   我们对一个方法 增加Synchronized关键字后,当多个线程访问该方法时,整个执行过程会变 ...

  5. java中synchronized同步锁实现生产者消费者模式

    synchronized介绍 一.基本概念 synchronized关键字是java里面用来在多线程环境下保证线程安全的同步锁:java里面有对象锁和类锁,对象锁是用在对象实例的方法上或者一个对象实例 ...

  6. 三、synchronized同步锁

    一.简介 在Java多线程中,我们要实现同步串行最早接触的就是synchronized关键字. 基本语法如下: synchronized(锁) {// 代码块 } sychronized关键字的锁主要 ...

  7. synchronized同步锁原理详解

    Java对象头 JVM中对象头的结构有以下两种(以32位JVM为例): 普通对象的对象头结构 数组对象的对象头结构 其中Mark Word结构 64位虚拟机 Mark Word的结构 Mark Wor ...

  8. synchronized同步锁的三种方式

    不多说,直接上代码 import java.util.ArrayList; import java.util.Collections; import java.util.List; import ja ...

  9. Java中String做为synchronized同步锁

    synchronized (("" + userId).intern()) {// TODO:something} JVM内存区域里面有一块常量池,关于常量池的分配: JDK6的版 ...

最新文章

  1. 基于OpenCV的车辆变道检测
  2. java编程思想(第四版)第二章练习题-12
  3. 【深度学习】我用 PyTorch 复现了 LeNet-5 神经网络(自定义数据集篇)!
  4. Matlab高级绘图功能
  5. 如何在CentOS 7上安装和配置MySQL Cluster
  6. Introduction to Oracle9i: SQL------- left join 和 left outer join 的区别
  7. UVA 1590 IP Networks
  8. delphi 10.3.1 android沉浸式透明状态栏
  9. 如何建立数学模型系列之【一.通俗解释及相关概念】
  10. linux 声卡驱动测试,Linux声卡驱动移植和测试
  11. 分析支付宝客户端的插件机制
  12. linux如何关闭netbios服务,Samba 'nmbd' NetBIOS名称服务守护程序拒绝服务漏洞
  13. 简述人工智能的应用领域
  14. 武魂显示无法连接服务器,武魂天下进不去连接服务器失败解决方法
  15. weblogic wls-wsat组件远程命令执行(CVE-2017-3506)
  16. 南宁python培训价格
  17. js 取色器和 颜色拾取工具
  18. 无法打开此计算机的组策略,无法运行gpedit.msc(组策略)的解决
  19. 与bootstrap相配合使用的插件
  20. 如何做一个简单的开放接口(1)-功能设计

热门文章

  1. 电缆、光缆、光纤有什么区别?
  2. Figma是什么软件?
  3. 电子产品EMC电磁兼容风险评估读书笔记(一)
  4. C语言学习--初始C语言02
  5. 通过Hadoop命令执行jar包
  6. pgadmin4信息收集语句
  7. 软交换FreeSWITCH系统概要和源代码初步分析
  8. Linux磁盘命令之lsblk命令
  9. 8086汇编实验(十题可用)
  10. string 中文乱码