Java synchronize线程安全测试

 更新时间:2020年04月14日 15:41:48   作者:时光spring  
这篇文章主要介绍了Java synchronize线程安全测试,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

线程的运行是与当前CPU的资源调度与时间片是有关系的,当一个线程中的执行到某一部分方法的时候轮到另外一个线程来执行相应的代码,所以还没有等到第一个线程执行完那么CPU有切换到另外一个线程来运行其相应的代码,所以这个时候假如操作公共的数据部分就会出现错误

为了解决这个问题,可以使用 synchronized 同步代码块来对公共部分进行同步操作

在用synchronize关键字修饰同步代码块时,运行代码发现不能交替卖票。 以下是初始代码

package com.itheima.Test;

public class Test1a {

  public static void main(String[] args) {
    Ticket1a t1=new Ticket1a();
    new Thread(t1,"A").start();
    new Thread(t1,"B").start();
    new Thread(t1,"C").start();
    
  }

}
class Ticket1a implements Runnable{
   int ticket=100;
  @Override
  public void run() {
    synchronized (Ticket1a.class) {          
    while (true) {
      if (ticket<=0) {
        break;
      }
      try {
        Thread.sleep(20);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
        System.out.println(Thread.currentThread().getName()+" sold  "+(ticket--));
    }
    }
  }
}

运行结果:

A sold  100
A sold  99
A sold  98
A sold  97
A sold  96
A sold  95
A sold  94
A sold  93
A sold  92
A sold  91
.
.
.
A sold  10
A sold  9
A sold  8
A sold  7
A sold  6
A sold  5
A sold  4
A sold  3
A sold  2
A sold  1

虽然解决了线程的安全问题,但是不能实现三个窗口交替卖票。后来仔细一看,是synchronize关键字修饰的代码块位置不对,相当于修饰了同步方法。

更改后:

@Override
  public void run() {
    while (true) {
        synchronized (Ticket1a.class) {
      if (ticket<=0) {
        break;
      }
      try {
        Thread.sleep(20);
      } catch (InterruptedException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
        System.out.println(Thread.currentThread().getName()+" sold  "+(ticket--));
      }
    }
  }

这样就完成了线程安全的小测试。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java日期格式化如何避免YYYY引发的时间异常

    Java日期格式化如何避免YYYY引发的时间异常

    在编程中,日期格式化是一个常见的任务,使用不同的格式化选项可能会导致一些意外的结果,下面我们就来学习一下Java如何避免YYYY引发的时间异常吧
    2023-11-11
  • java中使用@Transactional会有哪些坑

    java中使用@Transactional会有哪些坑

    在Java中,@Transactional是一个常用的注解,用于声明方法应该在一个事务的上下文中执行,本文主要介绍了java中使用@Transactional会有哪些坑,感兴趣的可以了解一下
    2024-04-04
  • SpringMVC中的SimpleUrlHandlerMapping用法详解

    SpringMVC中的SimpleUrlHandlerMapping用法详解

    这篇文章主要介绍了SpringMVC中的SimpleUrlHandlerMapping用法详解,SimpleUrlHandlerMapping是Spring MVC中适用性最强的Handler Mapping类,允许明确指定URL模式和Handler的映射关系,有两种方式声明SimpleUrlHandlerMapping,需要的朋友可以参考下
    2023-10-10
  • java 装饰模式(Decorator Pattern)详解及实例代码

    java 装饰模式(Decorator Pattern)详解及实例代码

    装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装
    2016-10-10
  • Java开发微信Navicat支付完整版

    Java开发微信Navicat支付完整版

    这篇文章主要介绍了Java开发微信Navicat支付完整版,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • 详解Mybatis通用Mapper介绍与使用

    详解Mybatis通用Mapper介绍与使用

    目前通用mapper只支持对单表的操作,对单表的增删改查,无需在mapper.xml写对应的sql语句,只需要我们调用相应的接口,对于快速开发极为方便,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • 注解、原生Spring、SchemaBased三种方式实现AOP代码案例

    注解、原生Spring、SchemaBased三种方式实现AOP代码案例

    这篇文章主要介绍了注解、原生Spring、SchemaBased三种方式实现AOP的方法介绍,文中有详细的代码示例,对我们的学习有一定的帮助,需要的朋友可以参考下
    2023-06-06
  • Java消息队列Kafka的简单概述

    Java消息队列Kafka的简单概述

    这篇文章主要介绍了Java消息队列Kafka的简单概述,消息系统负责将数据从一个应用程序传输到另一个应用程序,应用程序可以专注于数据,不担心如何共享它,需要的朋友可以参考下
    2023-07-07
  • java读取txt文件代码片段

    java读取txt文件代码片段

    这篇文章主要为大家详细介绍了java读取txt文件的代码片段,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05
  • 新版idea创建spring boot项目的详细教程

    新版idea创建spring boot项目的详细教程

    这篇文章给大家介绍了新版idea创建spring boot项目的详细教程,本教程对新手小白友好,若根据教程创建出现问题导致失败可下载我提供的源码,在文章最后,本教程较新,文中通过图文给大家介绍的非常详细,感兴趣的朋友可以参考下
    2024-01-01

最新评论