java基础之线程安全问题(一)

2023-05-16

目录

一:线程安全判断依据

二:解决线程安全问题实现(同步代码块)

1:格式

2:同步代码块的锁对象是谁?

3:同步方法的时候,锁对象又是谁呢?

4:静态同步方法,锁对象是谁?

三:卖票程序

1:分析

2:第一种实现多线程方法写卖票程序

3: 第二种实现多线程方法写卖票程序

4:注意事项


一:线程安全判断依据

1、是否存在多线程环境

2、是否存在共享数据/共享变量

3、是否有多条语句操作着共享数据/共享变量

二:解决线程安全问题实现(同步代码块)

1:格式

synchronized(锁对象){//对象要先创建可以是自定义类对象也可以是object类对象

synchronized加在方法上时在修饰符和返回值之间

需要同步的代码;

}

2:同步代码块的锁对象是谁?

任意对象

package day32;

public class SellTicketThread implements Runnable{//自定义类实现Runnable接口
    int tickets=100;//定义票总量
    boolean b =true;//一个布尔标识来控制程序的结束
    Object o = new Object();//定义一个对象
    @Override
    public void run() {
        while(b){
            synchronized (o){//同步代码块 synchronized中传入o对象
                if(tickets>0){
                    System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets--+"张票");//打印窗口名字以及正在卖的票
                }
                else{
                    b=false;
                }
            }
        }
    }
}

3:同步方法的时候,锁对象又是谁呢?

this

package day32;

public class SellTicketThread implements Runnable{
    int tickets=100;
    boolean b =true;
    @Override
    public void run() {
        sellTickets();//调用方法

    }
    public void sellTickets(){
        while(b){
            synchronized (this){//传入this对象
                if(tickets>0){
                    System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets--+"张票");
                }
                else{
                    b=false;
                }
            }
        }
    }
}

4:静态同步方法,锁对象是谁?

该静态同步方法所属那个类的字节码文件

字节码文件也属于一种对象。静态方法属于那个类的字节码文件即 类名.class

package day32;

public class SellTicketThread implements Runnable{
    static int tickets=100;//变量加static因为静态的方法只能调用静态的变量
    static boolean b =true;
    @Override
    public void run() {
        sellTickets();//调用方法

    }
    public static void sellTickets(){
        while(b){
            synchronized (SellTicketThread.class){//传入当前类节码文件
                if(tickets>0){
                    System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets--+"张票");
                }
                else{
                    b=false;
                }
            }
        }
    }
}

三:卖票程序

1:分析

卖票程序是否满足以上线程安全条件

1、是否存在多线程环境 是,由于有三个线程模拟三个窗口

2、是否存在共享数据/共享变量 是 共享数据是100张票

3、是否有多条语句操作着共享数据/共享变量 是

2:第一种实现多线程方法写卖票程序

package day32;

public class SellTicketThread1 extends Thread {
    static int tickets =100;//定义票数
    boolean b =true;//定义标识
    Object o =new Object();
    @Override
    //重新run方法
    public void run() {
        while(b){
            synchronized (o){
                if(tickets>0){
                    System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets--+"张票");
                }
                else{//如票数小于等于0,标识为false退出循环
                    b =false;
                }
            }
        }
    }
}
package day32;

public class SellTickets2 {
    public static void main(String[] args) {
        //创建自定义类对象
        SellTicketThread1 sellTicketThread = new SellTicketThread1();
        SellTicketThread1 sellTicketThread1 = new SellTicketThread1();
        SellTicketThread1 sellTicketThread2 = new SellTicketThread1();
        //他们设置名字
        sellTicketThread.setName("窗口一");
        sellTicketThread1.setName("窗口二");
        sellTicketThread2.setName("窗口三");
        //启动线程
        sellTicketThread.start();
        sellTicketThread1.start();
        sellTicketThread2.start();
    }
}

3: 第二种实现多线程方法写卖票程序

package day32;

public class SellTicketThread implements Runnable{
    int tickets=100;//定义票数
    boolean b =true;//定义标识
    Object o =new Object();
    @Override
    //重新run方法
    public void run() {
        while(b){
            synchronized (o){
                if(tickets>0){
                    System.out.println(Thread.currentThread().getName()+"正在卖第"+tickets--+"张票");
                }
                else{//如票数小于等于0,标识为false退出循环
                    b =false;
                }
            }
        }
    }
}
package day32;

public class SellTickets {
    public static void main(String[] args) {
        SellTicketThread sellTicketThread = new SellTicketThread();//创建继承Runnable类对象
        //将继承Runnable类对象传入Thread构造方法中创建三个线程
        Thread w1 = new Thread(sellTicketThread, "窗口一");
        Thread w2 = new Thread(sellTicketThread, "窗口二");
        Thread w3 = new Thread(sellTicketThread, "窗口三");
        //启动线程
        w1.start();
        w2.start();
        w3.start();

    }
}

 4:注意事项

当有共享变量用继承thread类时变量要有public satatic修饰

有共享变量时最好用继承接口方式

因为锁是多个线程公用一个是唯一的

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

java基础之线程安全问题(一) 的相关文章

随机推荐

  • 对Excel表格数据的导出

    一 xff1a 有Excel文件模板的导出 xff08 1 xff09 判断模板文件是否存在 1 先通过Server MapPath 将相对的路径转为实际的物理路径 2 然后在通过IO流判断文件是否存在 例 xff1a System IO
  • Linux命令

    基本操作 Linux关机 重启 关机 shutdown h now 重启 shutdown r now 查看系统 CPU信息 查看系统内核信息 uname a 查看系统内核版本 cat proc version 查看当前用户环境变量 env
  • AOP概念及作用详细解释

    今天学习spring的时候接触到一个新的知识以及概念AOP 老师当时讲这个知识点的时候 xff0c 并没有讲太多关于这方面的知识 xff0c 我们所学习到的知识侧重于应用 xff0c 所以对这一块的理论知识是有一点缺少 xff0c 以至于小
  • Permission denied解决办法之一

    最近在编一个小程序 xff0c 有一步需要我删除一个文件 xff0c 但当用remove 后返回值始终是 1 用了perror后提示 Permission denied xff0c 在搜索后总是找不到解决办法 xff0c 然后我感觉是需要删
  • 数脉科技:Windows server 2016的基础设置

    是否经常不会设置Windows server 2016这款服务器而苦恼呢 xff0c 现在不用怕了数脉科技一点一点耐心的来教会大家如何学会Windows server 2016的基础设置吧 xff01 一 组策略 WIN键 43 R键 xf
  • 2020-09-11

    三招你成为短视频大神 xff01 很多小伙伴对于自媒体比较眼红 xff0c 看着抖音快手上很多靠直播 靠短视频火起来的人都挣到钱了 xff0c 所以跃跃欲试 xff0c 也想在这里面分一杯羹 但是真的那么容易吗 xff1f 直播就不用说了
  • 2020-10-15

    短视频配音选材的方法 网络短视频内容花样众多 xff0c 在快手短视频或者抖音短视频上面总是能刷到很多新奇的东西 xff0c 其中给短视频配音也是一个模块 xff0c 根据剧情来即兴发挥或者编排台词都是很重要的一部分 给短视频配音又分好多种
  • 服务器处理能力,你估算正确过吗?

    服务器处理能力 xff0c 你估算正确过吗 xff1f 作者 xff1a 成晓旭 1 引题 但凡写过技术方案的都知道 xff0c 在技术方案最终落实到工程实施部署时 xff0c 必须编制出当前解决方案需要部署的IT设备及环境 xff0c 包
  • 2020-10-20

    抖音快手短剧本写作方法 看别人拍的视频拍的新鲜有趣 xff0c 但是自己就是拍不出那种效果 xff0c 其实抖音视频前期是非常好做的 xff0c 可能发一个PPT一样的几张靓照或者是逗猫咪的小视频 xff0c 就能轻松获赞数十万 但是有个词
  • 2020-11-02

    如何更好的制作短视频内容 xff1f 细节决定成败 xff0c 对抖音短视频尤其重要 xff0c 抖音本来就是以内容为主的短视频平台 一个短视频能火 xff0c 一个短视频不火 xff0c 相同的主题 xff0c 不同的细节 xff0c 它
  • 2020-11-24

    如何才能撰写出好的短视频文案 首先是要调起用户的共鸣 xff0c 比如以前抖音上很火的一个视频 视频拍的很简单 xff0c 就是坐在出租车上拍摄的一些 xff0c 呼啸而过的高楼大厦和车流 xff0c 以及灰色的天空和不断向后跑的树 视频和
  • 2020-11-26

    短剧本创作小技巧 xff0c 提升完播率 相信每一个编剧在自己的短剧本拍成视频时 xff0c 都会有满足感和成就感 但有的时候 xff0c 也会辗转难眠 xff0c 而其中遇到了最大问题就是完播率太低 而影响完播率的关键所在 xff0c 就
  • 2020-11-28

    短剧本中的场景选择 一般在写短剧本的时候 xff0c 一个故事里面会有很多的故事场景 xff0c 场景写的比较好就会使短剧本在转换为段视频的时候 xff0c 制作的短视频会更加的好看 故事的场景也算得上是一个故事的主要开端 xff0c 开端
  • 基于C++11实现的阻塞队列(BlockQueue)

    思路 xff1a 生产者消费者模型 如图 xff0c 多个生产者线程和多个消费者线程共享同一固定大小的缓冲区 xff0c 它们的生产和消费符合以下规则 xff1a 生产者不会在缓冲区满的时候继续向缓冲区放入数据 xff0c 而消费者也不会在
  • 航空订票系统设计(java、数据库、通信联合项目)

    航空订票系统设计 xff08 java 数据库 通信联合项目 xff09 最近帮高中同学做的一个学校项目 xff0c 这个项目主要是用Java写的 前期主要搭建五个类 xff0c Order xff08 选择 xff09 Passenger
  • java基础之IO流中的字节流

    目录 一 xff1a 字节流写数据 二 xff1a 字节流写数据的方式 三 xff1a 字节流写数据实例 字节流写数据步骤 字节流写数据例子 字节流追加写数据 四 xff1a 字节流读取数据 五 xff1a 字节读取数据的方法 六 xff1
  • java基础之转换流

    目录 一 xff1a 解释 二 xff1a 转换流输入流 1 xff1a 构造方法 2 xff1a InputStreamReader读数据方法 3 xff1a 例子 3 xff1a 注意 三 转换流输出流 1 xff1a 构造方法 2 x
  • java基础之多线程的引入

    目录 一 xff1a 多线程概述 进程 线程 举例 二 xff1a 并行与并发 三 xff1a Java程序的运行原理 四 xff1a JVM启动的时候是单线程还是多线程呢 xff1f 一 xff1a 多线程概述 进程 正在运行的程序 xf
  • 电信运营商云计算体系架构分析

    电信运营商云计算体系架构分析 作者 xff1a 成晓旭 xff08 版权保留 欢迎转载 xff09 第三篇 xff1a 体系架构分析 电信运营商云计算发展分析之一 xff1a 战略定位分析 xff0c 可供参考 电信运营商云计算发展分析之二
  • java基础之线程安全问题(一)

    目录 一 xff1a 线程安全判断依据 二 xff1a 解决线程安全问题实现 同步代码块 1 格式 2 同步代码块的锁对象是谁 xff1f 3 xff1a 同步方法的时候 xff0c 锁对象又是谁呢 xff1f 4 xff1a 静态同步方法