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程序设计有所帮助。

(0)

相关推荐

  • java中synchronized(同步代码块和同步方法)详解及区别

     java中synchronized(同步代码块和同步方法)详解及区别 问题的由来: 看到这样一个面试题: //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized (obj){} } synchronized用于解决同步问题,当有多条线程同时访问共享数据时,如果进行同步,就会发生错误,Java提供的解决方案是:只要将操作共享数据的语句在某一时段让一个线程执行完,在执行过程中,其他

  • java 中同步方法和同步代码块的区别详解

    java 中同步方法和同步代码块的区别详解 在Java语言中,每一个对象有一把锁.线程可以使用synchronized关键字来获取对象上的锁.synchronized关键字可应用在方法级别(粗粒度锁)或者是代码块级别(细粒度锁). 问题的由来: 看到这样一个面试题: //下列两个方法有什么区别 public synchronized void method1(){} public void method2(){ synchronized (obj){} } synchronized用于解决同步问

  • java多线程的同步方法实例代码

    java多线程的同步方法实例代码 先看一个段有关银行存钱的代码: class Bank { private int sum; public void add(int num){ sum = sum + num; try { Thread.sleep(10); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("total num is : " + sum); } } class Cu

  • java多线程编程之Synchronized块同步方法

    文章分享了4个例子对synchronized的详细解释 1.是否加synchronized关键字的不同 public class ThreadTest { public static void main(String[] args) { Example example = new Example(); Thread t1 = new Thread1(example); Thread t2 = new Thread1(example); t1.start(); t2.start(); } } cl

  • Java使用同步方法解决银行取钱的安全问题案例分析

    本文实例讲述了Java使用同步方法解决银行取钱的安全问题.分享给大家供大家参考,具体如下: 一 点睛 与同步代码块对应,Java的多线程安全支持还提供了同步方法,同步方法就是使用synchronized关键字来修饰某个方法,则该方法称为同步方法.对于synchronized修饰的实例方法(非static方法)而言,无须显示指定同步监视器,同步方法的同步监视器是this,也就是调用该方法的对象. 通过使用同步方法可以非常方便地实现线程安全的类,线程安全的类具有如下特征. 该类的对象可以被多个线程安

  • Java线程同步、同步方法实例详解

    线程的同步是保证多线程安全访问竞争资源的一种手段. 线程的同步是Java多线程编程的难点,往往开发者搞不清楚什么是竞争资源.什么时候需要考虑同步,怎么同步等等问题,当然,这些问题没有很明确的答案,但有些原则问题需要考虑,是否有竞争资源被同时改动的问题? 对于同步,在具体的Java代码中需要完成一下两个操作: 把竞争访问的资源标识为private: 同步哪些修改变量的代码,使用synchronized关键字同步方法或代码. 当然这不是唯一控制并发安全的途径. synchronized关键字使用说明

  • Java线程同步方法实例总结

    本文实例讲述了Java线程同步方法.分享给大家供大家参考,具体如下: 1. Semaphore 1.1 二进制Semaphore Semaphore算是比较高级点的线程同步工具了,在许多其他语言里也有类似的实现.Semaphore有一个最大的好处就是在初始化时,可以显式的控制并发数.其内部维护这一个c计数器,当计数器小于等于0时,是不允许其他线程访问并发区域的,反之则可以,因此,若将并发数设置为1,则可以确保单一线程同步.下面的例子模拟多线程打印,每个线程提交打印申请,然后执行打印,最后宣布打印

  • java多线程编程之使用Synchronized块同步方法

    synchronized关键字有两种用法.第一种就是在<使用Synchronized关键字同步类方法>一文中所介绍的直接用在方法的定义中.另外一种就是synchronized块.我们不仅可以通过synchronized块来同步一个对象变量.也可以使用synchronized块来同步类中的静态方法和非静态方法.synchronized块的语法如下: 复制代码 代码如下: public void method(){    - -    synchronized(表达式)    {        -

  • Java同步代码块解决银行取钱的安全问题实例分析

    本文实例讲述了Java同步代码块解决银行取钱的安全问题.分享给大家供大家参考,具体如下: 一 点睛 为了解决类似银行取钱这类安全问题,Java的多线程支持引入了同步监视器来解决这个问题,使用同步监视器的通用方法是同步代码块.同步代码块的语法格式是: synchronized(obj) { //此处代码块就是同步代码块. } 上面语法格式中种的obj就是同步监视器,上面代码的含义是:线程开始执行同步代码块之前,必须先获得对同步监视器的锁定. 任何时刻只能由一个线程获得对同步监视器的锁定,当同步代码

  • 详解Java多线程编程中的线程同步方法

    1.多线程的同步: 1.1.同步机制: 在多线程中,可能有多个线程试图访问一个有限的资源,必须预防这种情况的发生.所以引入了同步机制:在线程使用一个资源时为其加锁,这样其他的线程便不能访问那个资源了,直到解锁后才可以访问. 1.2.共享成员变量的例子: 成员变量与局部变量: 成员变量: 如果一个变量是成员变量,那么多个线程对同一个对象的成员变量进行操作,这多个线程是共享一个成员变量的. 局部变量: 如果一个变量是局部变量,那么多个线程对同一个对象进行操作,每个线程都会有一个该局部变量的拷贝.他们

随机推荐