Java同步代码块和同步方法原理与应用案例详解

 更新时间:2019年10月23日 08:47:01   作者:cakincqm  
这篇文章主要介绍了Java同步代码块和同步方法原理与应用,结合具体案例形式分析了使用java同步代码块和同步方法实现买票功能的相关原理与操作技巧,需要的朋友可以参考下

本文实例讲述了Java同步代码块和同步方法。分享给大家供大家参考,具体如下:

一 点睛

所谓原子性:一段代码要么执行,要么不执行,不存在执行一部分被中断的情况。言外之意是这段代码就像原子一样,不可拆分。

同步的含义:多线程在代码执行的关键点上,互通消息,相互协作,共同把任务正确的完成。

同步代码块语法:

synchronized(对象)
{
  需要同步的代码块;
}

同步方法语法:

访问控制符 synchronized 返回值类型方法名称(参数)
{
  需要同步的代码;
}

二 同步代码块完成卖票功能

1 代码

public class threadSynchronization
{
  public static void main( String[] args )
  {
    TestThread t = new TestThread();
    // 启动了四个线程,实现资源共享
    new Thread( t ).start();
    new Thread( t ).start();
    new Thread( t ).start();
    new Thread( t ).start();
  }
}
class TestThread implements Runnable
{
  private int tickets = 5;
  @Override
  public void run()
  {
    while( true )
    {
      synchronized( this )
      {
        if( tickets <= 0 )
          break;
        try
        {
          Thread.sleep( 100 );
        }
        catch( Exception e )
        {
          e.printStackTrace();
        }
        System.out.println( Thread.currentThread().getName() + "出售票" + tickets );
        tickets -= 1;
      }
    }
  }
}

2 运行

Thread-0出售票5
Thread-3出售票4
Thread-3出售票3
Thread-2出售票2
Thread-2出售票1

三 同步方法完成买票功能

1 代码

public class threadSynchronization
{
  public static void main( String[] args )
  {
   TestThread t = new TestThread();
   // 启动了四个线程,实现资源共享的目的
   new Thread( t ).start();
   new Thread( t ).start();
   new Thread( t ).start();
   new Thread( t ).start();
  }
}
class TestThread implements Runnable
{
  private int tickets = 5;
 
  public void run()
  {
   while( tickets > 0 )
   {
     sale();
   }
  }
  public synchronized void sale()
  {
   if( tickets > 0 )
   {
     try
     {
      Thread.sleep( 100 );
     }
     catch( Exception e )
     {
      e.printStackTrace();
     }
     System.out.println( Thread.currentThread().getName() + "出售票"
        + tickets );
     tickets -= 1;
   }
  }
}

2 运行

Thread-0出售票5
Thread-0出售票4
Thread-3出售票3
Thread-2出售票2
Thread-1出售票1

更多java相关内容感兴趣的读者可查看本站专题:《Java进程与线程操作技巧总结》、《Java数据结构与算法教程》、《Java操作DOM节点技巧总结》、《Java文件与目录操作技巧汇总》和《Java缓存操作技巧汇总

希望本文所述对大家java程序设计有所帮助。

相关文章

  • springboot @Validated的概念及示例实战

    springboot @Validated的概念及示例实战

    这篇文章主要介绍了springboot @Validated的概念以及实战,使用 @Validated 注解,Spring Boot 应用可以有效地实现输入验证,提高数据的准确性和应用的安全性,本文结合实例给大家讲解的非常详细,需要的朋友可以参考下
    2024-04-04
  • 基于SpringCloudAlibaba+Skywalking的全链路监控设计方案

    基于SpringCloudAlibaba+Skywalking的全链路监控设计方案

    这篇文章主要介绍了基于SpringCloudAlibaba+Skywalking的全链路监控设计方案,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-01-01
  • 如何将Mybatis连接到ClickHouse

    如何将Mybatis连接到ClickHouse

    这篇文章主要介绍了如何将Mybatis连接到ClickHouse,帮助大家更好得理解和学习使用Mybatis,感兴趣的朋友可以了解下
    2021-03-03
  • SpringBoot中Mybatis注解一对多和多对多查询实现示例

    SpringBoot中Mybatis注解一对多和多对多查询实现示例

    这篇文章主要介绍了SpringBoot中Mybatis注解一对多和多对多查询的实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • spring boot集成redisson的最佳实践示例

    spring boot集成redisson的最佳实践示例

    这篇文章主要为大家介绍了spring boot集成redisson的最佳实践示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • Java中的BufferedInputStream与BufferedOutputStream使用示例

    Java中的BufferedInputStream与BufferedOutputStream使用示例

    BufferedInputStream和BufferedOutputStream分别继承于FilterInputStream和FilterOutputStream,代表着缓冲区的输入输出,这里我们就来看一下Java中的BufferedInputStream与BufferedOutputStream使用示例:
    2016-06-06
  • 浅谈Java中Lambda表达式的相关操作

    浅谈Java中Lambda表达式的相关操作

    java8新特性,Lambda是一个匿名函数,类似Python中的Lambda表达式、js中的箭头函数,目的简化操作,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 浅谈java线程状态与线程安全解析

    浅谈java线程状态与线程安全解析

    本文主要介绍了浅谈java线程状态与线程安全解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • Scala异常处理的方法深入分析

    Scala异常处理的方法深入分析

    Scala是一种多范式的编程语言,支持面向对象和函数式编程。Scala也支持异常处理,即在程序运行过程中发生意外或错误时,采取相应的措施
    2023-04-04
  • java为什么不建议用equals判断对象相等

    java为什么不建议用equals判断对象相等

    本文主要介绍了java为什么不建议用equals判断对象相等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论