【第八章 线程的同步机制(同步代码块、同步方法)】

2023-10-29

第八章 线程的同步机制(同步代码块、同步方法)

1.线程的同步机制方式一:同步代码块
java中通过同步机制解决线程安全问题。
synchronized(同步监视器){ //需要被同步的代码 }
②说明:
操作共享数据的代码即为需要被同步的代码。
共享数据:多个线程共同操作的变量。比如:ticket。
同步监视器:俗称:锁,任何一个类的对象都可以充当锁。
要求:多个线程必须要共用同一把锁。
③同步方式的好处:解决了线程安全问题。
操作同步代码时,只能有一个线程参与,其他线程等待,相当于是一个单线程的过程,效率低。
④在实现Runnable接口创建多线程的方式中,可用考虑使用this充当同步监视器。

//④在实现Runnable接口创建多线程
public class WindowTest1 {
    public static void main(String[] args) {
        Window1 w1=new Window1();
        Thread t1=new Thread(w1);
        Thread t2=new Thread(w1);
        Thread t3=new Thread(w1);
        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}
class Window1 implements  Runnable{
    private  int ticket=100;
    Object obj=new Object();
    @Override
    public void run() {
        while (true){
            synchronized (obj){//可用this,代表当前对象,对象唯一,锁唯一
                if(ticket>0){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
      System.out.println(Thread.currentThread().getName()+"卖票:票号为:"+ticket);
                    ticket--;
                }else {
                    break;
                }
            }
        }
    }
}

⑤在继承Thread类创建多线程的方式中,慎用this充当同步监视器,考虑使用当前类充当同步监视器。

//⑤继承Thread类创建多线程
public class WindowTest {
    public static void main(String[] args) {
        Window w1=new Window();
        Window w2=new Window();
        Window w3=new Window();
        w1.setName("窗口1");
        w2.setName("窗口2");
        w3.setName("窗口3");
        w1.start();
        w2.start();
        w3.start();
    }
}
class Window extends Thread{
    private  static int ticket=100;
    private  static Object obj=new Object();
    @Override
    public void run() {
        while (true){
            synchronized (obj){//class=clazz=Window.class,Window.class只会加载一次
                if(ticket>0){
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(getName()+":卖票,票号为:"+ticket);
                    ticket--;
                }else {
                    break;
                }
            }
        }
    }
}

2.线程的同步机制方式二:同步方法
同步方法仍然涉及到同步监视器,只是不需要我们显式的声明,非静态的同步方法同步监视器为this,静态的同步方法的监视器为当前类本身。
①在实现Runnable接口创建多线程

public class WindowTest3 {
    public static void main(String[] args) {
        Window1 w1=new Window1();
        Thread t1=new Thread(w1);
        Thread t2=new Thread(w1);
        Thread t3=new Thread(w1);
        t1.setName("窗口1");
        t2.setName("窗口2");
        t3.setName("窗口3");
        t1.start();
        t2.start();
        t3.start();
    }
}
class Window3 implements  Runnable{
    private  int ticket=100;
    @Override
    public void run() {
        while (true){
             show();
        }
    }
    private  synchronized void show(){//同步监视器:this
            if(ticket>0){
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
  System.out.println(Thread.currentThread().getName()+"卖票:票号为:"+ticket);
                ticket--;
            }
    }
}

②继承Thread类创建多线程

public class WindowTest4 {
    public static void main(String[] args) {
        Window4 w1=new Window4();
        Window4 w2=new Window4();
        Window4 w3=new Window4();
        w1.setName("窗口1");
        w2.setName("窗口2");
        w3.setName("窗口3");
        w1.start();
        w2.start();
        w3.start();
    }
}
class Window4 extends Thread{
    private  static int ticket=100;
    @Override
    public void run() {
    	while(true){
        show();}
    }
private static synchronized void show(){
//同步监视器:t1,t2,t3,此时同步监视器为Window4.class
        if(ticket>0){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(Window4.currentThread().getName()+":卖票,票号为:"+ticket);
            ticket--;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【第八章 线程的同步机制(同步代码块、同步方法)】 的相关文章

  • 如何知道 HTTP 服务器何时完成发送数据

    我正在开发一个面向浏览器 代理的项目 我需要下载网页 向 Web 服务器发送自定义 HTTP 请求后 我开始监听服务器响应 读取响应时 我检查响应标头中的 Content Length row 如果我得到其中之一 很容易确定服务器何时完成发
  • 使用 java 从 XML 元素中删除空格

    我有一个 JSON 如下 String str Emp name JSON Emp id 1 Salary 20997 00 我想使用 java 将此 JSON 转换为 XML 我的 java 代码在这里 JSON json JSONSer
  • 无法禁用 Firestore 中的离线数据

    从我的数据中删除数据后Firestore Database 这需要我的Android app一段时间后才意识到数据已被删除 我认为这是由于自动数据缓存而发生的 我的应用程序与离线使用无关 我想禁用此功能 我已将其添加到我的自定义中Appli
  • 为 JSP 创建注销链接?

    当用户登录我的应用程序时 他提交一个要通过 Servlet 处理的表单 servlet 为用户创建一个会话 我如何创建一个链接以便用户可以注销 我似乎无法直接链接到 Servlet 如何删除会话并链接回主页 HttpSession sess
  • 如何增加使用 SAX 解析 XML 文件的entityExpansionLimit

    我正在尝试使用 Java 中的 SAX 解析器解析一个 1 23 GB 的 XML 文件 我使用的是 Mac 操作系统和 JDK 1 7 0 51 不幸的是 我收到以下错误 The pasrser has encountered more
  • rmi类找不到异常

    我使用 java rmi 编写了一个简单的项目并导出到可执行 jar 文件 当我尝试运行它时 有时会出现异常 有时会起作用 当我指定 Djava rmi server codebase file serverClasses 时 它似乎没有正
  • 当Java中set已经是原子的时候,为什么我们还需要compareAndSet呢?

    因为原子意味着线程安全 当 set 本身在java中是原子和线程安全的时候 我们什么时候使用compareAndSet 举例来说 我想以原子方式设置一个变量 以便每个其他线程都可以看到它 但我希望以线程安全的方式设置该变量 我可以简单地将其
  • Cognito SRP 身份验证 JAVA SDK

    我正在尝试使用 Cognito 验证 Java 应用程序 我在Python中使用了warrant库 效果非常好 但我现在想在java中做同样的事情 我的 Python 函数用于身份验证warrant https github com cap
  • 如何修复运行 Android 模拟器时出现 GPU Driver Issue 错误

    我的 Android 模拟器几周前运行良好 但现在出现错误 当我运行代码时 GPU 驱动程序问题错误对话框与模拟器一起弹出 当我单击 确定 时 Android 模拟器不会按预期运行应用程序 错误如下 Your GPU driver info
  • 当我打印出数组列表的索引时如何删除最后一个逗号[重复]

    这个问题在这里已经有答案了 List
  • 不带破折号的 CliBuilder 参数

    使用 Groovy CliBuilder 理想情况下我希望有一个命令行 如下所示 MyProgram groovy CommandName arg1 arg2 arg3 是否可以使用 CliBuilder 解析提取 CommandName
  • 如何在 HashiCorp Vault 中安全地存储 Spring Boot 应用程序的机密?

    我已阅读以下教程 保险库配置 https spring io guides gs vault config 好的 我们安装了 Vault 服务器并放置了 2 对秘密属性 vault kv put secret gs vault config
  • toArray 与预先确定大小的数组

    使用时ar toArray new String ar size 安卓工作室3 2 1警告预先确定大小的数组并建议空数组 有两种方式将集合转换为数组 使用 预先确定大小的数组 如 c toArray new String c size 或使
  • Apache Camel - 路由中的事务

    我有一个关于 Apache Camel 的一般性问题 我无法找到聚合器是否已进行交易 如果是交易 交易是如何实现的 聚合的速度有多快 将消息发送到聚合器可以在事务中运行 您需要一个带有聚合器的持久存储来让传出消息充当事务 请参阅有关持久性的
  • 为什么我在 Java 中收到有关“可能丢失精度”的警告?

    class Test public static void main String args short s 2 s1 200 s2 s2 s s1 error possible loss of precision System out p
  • 何时对字符串文字使用 intern()

    我看到很多这样的遗留代码 class A public static final String CONSTANT value intern 我看不出使用 intern 的任何原因 因为在 Javadoc 中可以读到 所有文字字符串和字符串值
  • 尝试用Java实现基于文本的Hangman游戏

    我需要检查用户输入的字母以及他们猜测的空格是否位于隐藏单词的特定位置 变量one等于用户猜测的空间索引 而letterGuess是他们猜测的字母 我的代码怎么错了 示例 秘密词是你好 hidden word is 用户猜测h 0 1 2 3
  • 在服务器上创建 Zip 文件并使用 java 下载该 zip

    我从 mkyong 获得了以下代码 用于在本地压缩文件 但是 我的要求是在服务器上压缩文件并需要下载它 任何人都可以帮忙吗 代码写入zip文件 public void zipFiles File contentFile File navFi
  • Java Media API:java media api 下载

    我在哪里可以找到javax media jar 文件 在sun站点它下载一个安装程序 有没有可用的java媒体jar 没有 javax media 具体是 jar 文件 该包位于 jmf jar 文件中 您需要运行安装程序并取出 jar 或
  • 项目级别的@PowerMockIgnore

    在 Maven 中运行时 我的 powermock 测试用例出现以下错误 java lang LinkageError loader constraint violation loader instance of org powermock

随机推荐

  • B树与B+树

    一 B树 B 树 特点 1 多路 非二叉树 2 每个节点既保存索引 又保存数据 3 搜索时相当于二分查找 二 B 树 特点 1 多路非二叉 2 只有叶子节点保存数据 3 搜索时相当于二分查找 4 增加了相邻接点的指向指针 三 B树与B 树的
  • 决策树和 K 近邻分类

    决策树和 K 近邻分类 决策树和 K 近邻分类 决策树和 K 近邻分类 介绍 知识点 机器学习介绍 示例 决策树 如何构建决策树 熵 玩具示例 决策树构建算法 分类问题中其他的分割质量标准 示例 树的关键参数
  • CUnit的用法

    CUnit下载地址 http sourceforge net projects cunit CUnit 在线文档帮助 http cunit sourceforge net doc index html 关于CUnit 本文主要从介绍三方面的
  • Corosync+Pacemaker+DRBD+MySQL 实现高可用(HA)的MySQL集群

    大纲一 前言二 环境准备三 Corosync 安装与配置四 Pacemaker 安装与配置五 DRBD 安装与配置六 MySQL 安装与配置七 crmsh 资源管理 推荐阅读 Linux 高可用 HA 集群基本概念详解 http www l
  • c语言中delay的用法。

    C语言作为一门新型高级编程语言 在计算机软件编程中具有较为广泛的应用和实现 下面小编就跟你们详细介绍下c语言中delay的用法 希望对你们有用 c语言中delay的用法如下 假设一个延时函数如下 void delay uint i for
  • Unity 动态生成mesh圆圈

    using UnityEngine using System Collections RequireComponent typeof MeshRenderer typeof MeshFilter public class yuan Mono
  • BIOS中开启虚拟化技术

    安装Intel Hardware Accelerated Execution Manager 为了避免Android虚拟设备创建过程中发生错误 下载地址 https software intel com en us android arti
  • 闲置资源优化,轻松检查集群中的空闲成本

    前言 Kubernetes 提供了对计算 网络 存储资源的抽象 提升了集群资源管理的效率 然而 由于用户不需要直接管理底层资源 可能导致部分闲置资源未及时发现 造成成本浪费 在企业 IT 成本治理过程中 如何发现并处理这部分资源 是成本优化
  • Nvidia Deepstream极致细节:3. Deepstream Python RTSP视频输出显示

    Nvidia Deepstream极致细节 3 Deepstream Python RTSP视频输出显示 此章节将详细对官方案例 deepstream test 1 rtsp out py作解读 deepstream test 1 rtsp
  • Buuctf——[RCTF2015]EasySQL

    Buuctf RCTF2015 EasySQL 一 解题步骤 1 看到注册登录 闲着没事先注册个号试试 1 123 2 进去看了 除了受到文化熏陶 别的好像没有啥 点一下试试其有什么功能 一不小心就看到了修改密码 3 惊奇的发现 密码可以被
  • 【数据结构】二、顺序表的定义和基本操作的实现

    目录 数据结构 DATA STRUCTURE 二 线性表 2 1 线性表的定义和基本操作概述 2 2 线性表的顺序表示 2 2 1 顺序表存储结构描述和特点 1 静态存储方式 2 动态存储方式 3 顺序表的优缺点 2 2 2 顺序表基本操作
  • 数据库-ER建模

    目录 基本概念 1 实体 entity 2 属性 attribute 3 联系 relation 3 1 基数约束的四种形态 3 1 1 基数约束形态一 3 1 2 基数约束形态二 3 1 3 基数约束形态三 3 1 4 基数约束形态四 扩
  • OneOS文字转语言组件实操

    本文分享自中移OneOS微信公众号 当万耦遇上chaoTTS 作者 柏灵 大家好 柏灵又又又来啦 相信大家已经开始在寒冷的冬季种植鲜嫩的豌豆尖 火锅里烫上豌豆尖 从此打工人有了豌豆尖自由 还没有种植的小伙伴 可以通过OneOS 基于端云融合
  • fit、transform、fit_transform的区别,为什么训练集用 fit_transform , 测试集用 transform

    三个函数的使用具体解释 在数据预处理中的应用 1 只涉及一组数据 fit data 对数据进行拟合 获得了数据的均值 最大最小 标准差等属性值 transform data 利用 fit data 获取到的属性对数据做预处理 如标准化 归一
  • cocos cretor shader effect-the book of shader前言

    前言 说来惭愧 半年前开始接触cocso creator shader的时候 看了官方教程 看了大神写的例子 搞懂了一些语法概念 可是当时看一遍有种似懂非懂的感觉 那种感觉就是听过很多道理 任然过不好一生 在cocos论坛里有大神也分享过自
  • Foxmail 搜索功能找不到全部邮件问题的解决方法。

    经常使用Foxmail办公收发邮件 发现Foxmail 搜索功能找不到全部邮件 原来问题出在搜索上 举例说明 迁移到Foxmail后 王卡卡同志给我发过3封邮件 可是我用据称无比强大的Foxmail搜索邮件时 输入关键字 root 只能找到
  • [计算机毕业设计]数字水印算法

    前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校要求的毕设项目越来越难 有不少课题是研究生级别难度的 对本科同学来说是充满挑战 为帮助大
  • 梦幻模拟战pc版更新服务器正在维护,梦幻模拟战PC版免CD(更新2代跳出补丁 一些实用说明)...

    最近看到游侠有发梦幻模拟战PC版1 2 下载 不过要禁用DX 还要拔光驱 比较麻烦 我把我以前收藏的L1 L2 免CD发出来分享 我自己反正测试可以用 1代 第1步 替换langpc exe 请做好备份 第2步 复制光盘上 DISK1 ID
  • shell脚本中$!、$@、$#、$$、$0、$1、$2、$*的含义

    一 shell脚本中 0 1 2 的含义 Shell最后运行的后台Process的PID 后台运行的最后一个进程的进程ID号 添加到shell当中参数的个数 Shell本身的PID ProcessID 即脚本运行的当前进程ID号 0 脚本本
  • 【第八章 线程的同步机制(同步代码块、同步方法)】

    第八章 线程的同步机制 同步代码块 同步方法 1 线程的同步机制方式一 同步代码块 java中通过同步机制解决线程安全问题 synchronized 同步监视器 需要被同步的代码 说明 操作共享数据的代码即为需要被同步的代码 共享数据 多个