同步代码块 synchronized

2023-11-13

一,线程的同步

     原因: Java允许多线程并发执行,当多个线程同时操作一个可共享资源时,将会导致相互之间产生冲突,因此加入同步锁来避免该线程没有完成操作之前,被其他线程的调用,从而保证该资源的唯一性和准确性。

 三种实现同步方式:

  •     同步代码块
  •      同步方法
  •     锁机制   Lock

格式:

synchronized(任意对象){
   操作共享数据的代码
}

注意:

默认情况锁是打开的,只要有一个线程进去执行代码,锁就会关闭

当线程执行完出来了,锁才会自动打开

锁对象可以是任意对象,但是多个线程必须使用同一把锁

好处:解决了多线程的数据安全问题

弊端:当线程很多时,因为每个线程都会去判断同步上的锁,很消耗资源,降低程序运行效率 

 什么叫代码的同步

 使用同步锁以避免在该线程没有完成操作之前,被其他线程的调用,从而保证该变量的唯一性和准确性

二,同步方法

格式:

修饰符 synchronized 返回值类型 方法名(方法参数){
}

 区别:

  • 同步代码块可以锁住指定代码,同步方法是锁住方法中所有代码
  • 同步代码块可以指定锁住对象,同步方法不能

注意:

 同步方法是有默认存在的锁对象

对于非static方法,同步锁就是this

对于static方法,我们使用当前方法所在类的字节码对象

三,Lock锁 

 JDK5后提供了一个新的锁对象

提供了获得锁和释放锁的方法:

  •  void lick()  获得锁
  • void unlock() 释放锁

Lock锁是接口不能直接实例化,采用实现类ReentrantLock来实例化

Lock lock = new ReentLock();

死锁:

 两个线程对两个同步锁对象具有循环依赖,就大概会出现死锁

比如:

将大象放进冰箱!
大象锁:冰箱你把门打开,我才过去!
冰箱锁:你走过来,我才打开门!

避免:不适用锁的嵌套

生产者消费者

 比如:顾客和厨师

 

线程池的使用:

public class Demo2 {
    public static void main(String[] args) {
        //新建了一个线程任务
        Demo2Runnable demo2Runnable = new Demo2Runnable();
  ExecutorService executorService = Executors.newFixedThreadPool(5);
//submit:将线程任务提交到线程池中   执行线程
        executorService.submit(demo2Runnable);
        executorService.submit(demo2Runnable);
        executorService.submit(demo2Runnable);
        executorService.submit(demo2Runnable);
        executorService.submit(demo2Runnable);
        //关闭线程池
        executorService.shutdown();

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

同步代码块 synchronized 的相关文章

  • Java Runtime.getRuntime().freeMemory() 问题

    我搜索并看到了一些线程 但没有一个能够解决我遇到的具体问题 我正在尝试使用以下方式监视我的内存使用情况Runtime getRuntime freeMemory Runtime getRuntime maxMemory and Runtim
  • 打印星号的 ASCII 菱形

    我的程序打印出这样的钻石 但只有当参数或菱形的每一面为4 例如如果我输入6 底部三角形的间距是错误的 我一直在试图找出答案 当参数改变时 底部的三角形不会改变 只有顶部的三角形会改变 它只适用于输入4 public static void
  • 大数据使用什么数据结构

    我有一个包含一百万行的 Excel 工作表 每行有 100 列 每行代表一个具有 100 个属性的类的实例 列值是这些属性的值 哪种数据结构最适合在这里使用来存储数百万个数据实例 Thanks 这实际上取决于您需要如何访问这些数据以及您想要
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 来自十六进制代码的 Apache POI XSSFColor

    我想将单元格的前景色设置为十六进制代码中的给定颜色 例如 当我尝试将其设置为红色时 style setFillForegroundColor new XSSFColor Color decode FF0000 getIndexed 无论我在
  • 什么时候可以在 Java 中使用 Thead.stop() ?

    Thread stop 的 Java 文档听起来好像如果您调用 Thread stop 世界就会终结 已弃用 这种方法本质上是不安全的 停止线程 Thread stop 导致它解锁所有已锁定的监视器 作为未经检查的 ThreadDeath
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • 从 GitHub 上托管的 Spring Cloud Config Server 访问存储库的身份验证问题

    我在 GitHub 上的存储库中托管配置 如果我将回购公开 一切都好 但如果我将其设为私有 我将面临 org eclipse jgit errors TransportException https github com my user m
  • Java Swing For mac 中的 DJ Native Swing 浏览器

    我有一个用 Swing 制作的 Java 应用程序 并且使用了一个 DJ Native Swing 浏览器 当我尝试在 OS X 上使用它时 它抛出了一个NoClassDefFoundError尽管我添加了 swt jar 但始终如此 有人
  • 读取电子邮件的文本文件转换为 Javamail MimeMessage

    我有一个电子邮件原始来源的文本文件 直接从 gmail 复制 如果您单击 查看原始文件 您就会看到它 我想读入该文件并将其转换为 MimeMessage 如果您好奇为什么 我设置了 JavaMaildir 并且需要用电子邮件填充它的收件箱以
  • GWT 2.3 开发模式 - 托管模式 JSP 编译似乎不使用 java 1.5 兼容性

    无法编译 JSP 类 生成的 servlet 错误 DefaultMessage 上次更新 0 日期 中 0 时间 HH mm ss z 语法 错误 注释仅在源级别为 1 5 时可用 在尝试以开发模式在 Web 浏览器中打开我的 gwt 模
  • 使用架构注册表对 avro 消息进行 Spring 云合约测试

    我正在查看 spring 文档和 spring github 我可以看到一些非常基本的内容examples https github com spring cloud samples spring cloud contract sample
  • java库维护数据库结构

    我的应用程序一直在开发 所以偶尔 当版本升级时 需要创建 更改 删除一些表 修改一些数据等 通常需要执行一些sql代码 是否有一个 Java 库可用于使我的数据库结构保持最新 通过分析类似 db structure version 信息并执
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • Spring-ws:如何从没有“Request”元素的 xsd 创建 Wsdl

    尝试为客户端实现 SOAP Web 服务 我需要一个 wsdl 文件来通过soapUI 测试该服务 但正如您在下面看到的 这个 xsd 没有 Request 和 Response 方法 所有请求和响应都被定义为基本 ServiceProvi
  • 将 Apache Camel 执行器指标发送到 Prometheus

    我正在尝试转发 添加 Actuator Camel 指标 actuator camelroutes 将交换 交易数量等指标 发送到 Prometheus Actuator 端点 有没有办法让我配置 Camel 将这些指标添加到 Promet
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复
  • Spring表单ModelAttribute字段验证避免400 Bad Request错误

    我有一个ArticleFormModel包含正常发送的数据html form由 Spring 使用注入 ModelAttribute注释 即 RequestMapping value edit method RequestMethod PO

随机推荐

  • caffe 学习率设置问题

    solver算是caffe的核心的核心 它协调着整个模型的运作 caffe程序运行必带的一个参数就是solver配置文件 运行代码一般为 caffe train solver slover prototxt 在Deep Learning中
  • Unity和VS2019下载及配置流程

    https www jianshu com p 6fe2dc4de4c3
  • 可编程手机蓝牙App控制直流电机速度

    我们将通过 Android 应用程序 app 介绍直流电机速度控制 对于该项目 该应用程序安装在智能手机设备中 该设备使用蓝牙向控制直流电机速度的电路发送命令 此 Android 应用程序具有引人注目且易于使用的图形用户界面 GUI 我们将
  • IBM区块链负责人Jesse Lund的“你问我答”

    点击上方 蓝色字 可关注我们 编辑 铅笔盒 IBM区块链部门负责人Jesse Lund抽空参与了 你问我答 活动 Ask Me Anything AMA 回答了关于加密货币及IBM与Stellar合作关系的一些问题 具体内容如下 IBM现在
  • ue4 DerivedDataCache报错

    启动ue4时报错 报错堆栈如下 从堆栈可以看出是DerivedDataCache报错 从堆栈的CachedDataProbablyExists函数更可以看出是在判断cache是否存在 故而想到删除项目目录下DerivedDataCache中
  • RPC框架的异步处理

    RPC异步调用 以tars rpc框架为示例说明 引入工作线程池和io收发线程池将工作线程和io收发线程两者的同步关系解除 RPC中的上下文十分重要 因为请求包的发送 响应包的callback回调不在同一个工作线程中完成 需要一个conte
  • 计算机组长原理,期末项目考核-计算机组成原理-组长学号-组长姓名

    2012 2013 第一学期第一学期 计算机组成原理计算机组成原理 期末考核期末考核 职位姓名学号在项目中担任的工作成绩 组长 组员 组员 组员 一 项目一 项目 1 描述 描述 设 CPU 共有 16 根地址线 8 根数据线 R W 作读
  • 山洪灾害预警方案(山洪预警解决方案的组成)

    随着气候变化的不断加剧 山洪灾害在许多地区成为了极具威胁性的自然灾害之一 为了帮助地方政府和居民更好地预防和应对山洪灾害 我们设计了一套基于星创易联的SR600工业路由器和DTU200的山洪灾害预警方案 并成功在某地区进行了部署 案例背景
  • Transaction rolled back because it has been marked as rollback-only 解决办法

    今天早上高高兴兴上班 居然收到一大堆报警信息 仔细看了一下具体内容 都在提示这个错误 Transaction rolled back because it has been marked as rollback only 我一看就觉得奇怪了
  • Linux I/O编程 实验内容

    一 实验目的 练习用UNIX I O进行文件读写的编程方法 用UNIX I O函数管理文本信息 二进制数据 结构体数据 掌握UNIX I O的基本编程方法 练习测时函数使用 通过测量UNIX I O函数运行时间 建立UNIX I O API
  • 数据结构 ——二叉树 前序、中序、后序、层次遍历及非递归实现 查找、统计个数、比较、求深度的递归实现

    一 基本概念 每个结点最多有两棵子树 左子树和右子树 次序不可以颠倒 性质 1 非空二叉树的第n层上至多有2 n 1 个元素 2 深度为h的二叉树至多有2 h 1个结点 满二叉树 所有终端都在同一层次 且非终端结点的度数为2 在满二叉树中若
  • 牛客网 HJ96 表示数字

    牛客网 HJ96 表示数字 将一个字符中所有的整数前后加上符号 其他字符保持不变 连续的数字视为一个整数 import re def deal with match value match group value return value
  • Pix2PixHD 阅读笔记(翻译)

    High Resolution Image Synthesis and Semantic Manipulation with Conditional GANs 作者 Ting Chun Wang NVIDIA Ming Y u Liu NV
  • C++扫雷小游戏

    核心算法 就是关于点击雷区的操作 data数组用来储存雷区 雷9 非雷非数字 0 数字 1 8 clickdata数组用来储存雷区是否被按过 没按过 0 左键按过 1 右键按过 2 int click int i int j int k 点
  • LeetCode200—岛屿数量(java版)

    题目描述 标签 深度优先搜索 广度优先搜索 并查集 数组 矩阵 给你一个由 1 陆地 和 0 水 组成的的二维网格 请你计算网格中岛屿的数量 岛屿总是被水包围 并且每座岛屿只能由水平方向和 或竖直方向上相邻的陆地连接形成 此外 你可以假设该
  • drools 7.x 决策表转drl

    1 决策表内容 位置 Users lcc IdeaProjects drools test src main resources com drools excel table test1 personAge xlsx 内容 RuleSet
  • html5多个图片位置_React 实现简易的图片拖动排序

    基本介绍 在 web 页面中 如果需要改变多个元素的位置 可以通过元素拖动来实现 HTML5中加入了一个全局属性draggable 通过设置该属性的值为 true false 来控制元素是否可拖动 需要注意的是 链接和图片默认是可拖动的 可
  • Linux之vi编辑器的使用方法和常用命令

    Linux之vi编辑器 前言 对于初级程序开发工程师而言 Linux是很多人要接触的内容 为此我给大家来做一下总结 希望能够帮到你们 课程说明 1 介绍vi编辑器的使用方法 2 介绍vi编辑器的常用命令 vi编辑器 vi的基本概念 基本上v
  • 高德地图开发-常用api踩坑使用

    一 高德地图的加载初始化 在这就踩过很多坑 新建项目正常显示没问题 放到我们的项目就是不显示 加载不出来 这个时候不要慌 只要确保下面三部完成就莫问题了 1 引入高德地图开发者api 生成key的方式自行百度 一大堆 下面是我的 我开发的时
  • 同步代码块 synchronized

    一 线程的同步 原因 Java允许多线程并发执行 当多个线程同时操作一个可共享资源时 将会导致相互之间产生冲突 因此加入同步锁来避免该线程没有完成操作之前 被其他线程的调用 从而保证该资源的唯一性和准确性 三种实现同步方式 同步代码块 同步