`

关于线程同步问题

    博客分类:
  • java
 
阅读更多
* Java线程:线程的同步

  */

  public class Test {

  public static void main(String[] args) {

  User u = new User("张三", 100);

  MyThread t1 = new MyThread("线程A", u, 20);

  MyThread t2 = new MyThread("线程B", u, -60);

  MyThread t3 = new MyThread("线程C", u, -80);

  MyThread t4 = new MyThread("线程D", u, -30);

  MyThread t5 = new MyThread("线程E", u, 32);

  MyThread t6 = new MyThread("线程F", u, 21);

  t1.start();

  t2.start();

  t3.start();

  t4.start();

  t5.start();

  t6.start();

  }

  }

  class MyThread extends Thread {

  private User u;

  private int y = 0;

  MyThread(String name, User u, int y) {

  super(name);

  this.u = u;

  this.y = y;

  }

  public void run() {

  u.oper(y);

  }

  }

  class User {

  private String code;

  private int cash;

  User(String code, int cash) {

  this.code = code;

  this.cash = cash;

  }

  public String getCode() {

  return code;

  }

  public void setCode(String code) {

  this.code = code;

  }

/**

  * 业务方法

  * @param x 添加x万元

  */

  public synchronized void oper(int x) {

  try {

  Thread.sleep(10L);

  this.cash += x;

  System.out.println(Thread.currentThread().getName() + "运行结束,增加“" + x + "”,当前用户账户余额为:" + cash);

  Thread.sleep(10L);

  } catch (InterruptedException e) {

  e.printStackTrace();

  }

  }

  @Override

  public String toString() {

  return "User{" +

  "code='" + code + '\'' +

  ", cash=" + cash +

  '}';

  }

  }输出结果:线程A运行结束,增加“20”,当前用户账户余额为:120

  线程F运行结束,增加“21”,当前用户账户余额为:141

  线程E运行结束,增加“32”,当前用户账户余额为:173

  线程C运行结束,增加“-80”,当前用户账户余额为:93

  线程B运行结束,增加“-60”,当前用户账户余额为:33

  线程D运行结束,增加“-30”,当前用户账户余额为:3

  Process finished with exit code 0反面教材,不同步的情况,也就是去掉oper(int x)方法的synchronized修饰符,然后运行程序,结果如下:线程A运行结束,增加“20”,当前用户账户余额为:61

  线程D运行结束,增加“-30”,当前用户账户余额为:63

  线程B运行结束,增加“-60”,当前用户账户余额为:3

  线程F运行结束,增加“21”,当前用户账户余额为:61

  线程E运行结束,增加“32”,当前用户账户余额为:93

  线程C运行结束,增加“-80”,当前用户账户余额为:61

  Process finished with exit code 0很显然,上面的结果是错误的,导致错误的原因是多个线程并发访问了竞争资源u,并对u的属性做了改动。可见同步的重要性。注意:通过前文可知,线程退出同步方法时将释放掉方法所属对象的锁,但还应该注意的是,同步方法中还可以使用特定的方法对线程进行调度。这些方法来自于java.lang.Object类。void notify()

  唤醒在此对象监视器上等待的单个线程。

  void notifyAll()

  唤醒在此对象监视器上等待的所有线程。

  void wait()

  导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法。

  void wait(long timeout)

  导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者超过指定的时间量。

  void wait(long timeout, int nanos)

  导致当前的线程等待,直到其他线程调用此对象的 notify() 方法或 notifyAll() 方法,或者其他某个线程中断当前线程,或者已超过某个实际时间量。
 
分享到:
评论

相关推荐

    多线程代码 经典线程同步互斥问题 生产者消费者问题

    d: 经典线程同步互斥问题 e: 使用关键段解决子线程互斥问题 f: 利用事件实现线程同步问题 g: 利用互斥量来解决线程同步互斥问题 h: problem1 生产者消费者问题 (1生产者 1消费者 1缓冲区) problem1 more ...

    delphi中线程同步问题

    本文将深入探讨 `Synchronize` 的工作原理,并提出解决 DLL/ActiveForm 中线程同步问题的策略。 `Synchronize` 的实现基于事件和线程同步原语。当一个非主线程调用 `Synchronize` 时,它会创建一个同步记录结构,...

    C#线程同步的几种方法

    这意味着虽然`volatile`可以防止编译器重排序,但它不足以解决所有线程同步问题,尤其是在需要复合操作的情况下。 `volatile`可以应用于以下类型: - 任何引用类型 - 任何指针类型(在不安全上下文中) - `sbyte`, ...

    vc++中的线程锁(线程锁保持线程同步)

    在VC++编程环境中,线程同步是一个至关重要的概念,特别是在多线程程序设计中,以确保并发执行的线程能够安全地访问共享资源,避免数据竞争和其他潜在的问题。本篇文章将详细探讨线程锁在VC++中的应用,以及如何通过...

    线程同步问题

    ### 线程同步问题详解 #### 一、Java中的线程同步原理 在多线程编程中,线程同步是解决并发访问共享资源时出现的一致性问题的关键技术之一。Java语言为每个对象提供了一个监视器(Monitor),用于实现线程间的同步...

    作系统常见的进程或线程同步问题

    操作系统中的进程或线程同步是计算机科学中的一个重要概念,它主要关注的是多个进程或线程在执行时如何协调它们的活动,以确保系统的正确性和效率。在多处理器或多线程环境中,同步机制变得尤为重要,因为资源(如...

    MFC 多线程及线程同步

    MFC 多线程及线程同步 MFC 多线程及线程同步 MFC 多线程及线程同步

    多线程同步解决卖票问题

    多线程同步解决卖票问题

    C#中关于线程同步的练习

    线程同步可以帮助避免竞态条件、死锁等问题,提高程序的稳定性和性能。本文将深入探讨C#中的线程同步机制,并结合实例进行讲解。 1. **线程与多线程** 线程是程序执行的基本单元,每个线程都有自己的执行路径。在...

    java 线程同步 信号量控制同步

    关于线程同步,需要牢牢记住的第一点是:线程同步就是线程排队。同步就是排队。线程同步的真实意思和字面意思恰好相反。线程同步的目的就是避免线程“同步”执行。 关于线程同步,需要牢牢记住的第二点是 “共享”...

    线程同步小例子

    在编程领域,线程同步是多线程编程中的一个核心概念,它涉及到如何有效地管理和协调多个并发执行的线程,确保它们能正确地共享资源,避免数据竞争和死锁等问题。这个“线程同步小例子”是基于孙鑫先生著作中的示例...

    操作系统线程同步实验报告

    总结来说,本实验报告深入浅出地介绍了线程同步的概念,并通过实际操作展示了临界区问题及其解决方案。通过Mutex和软件方案的比较,帮助读者理解不同同步机制的工作原理和适用场景,为多线程编程提供了实用的指导。

    线程同步解决火车站售票问题

    在这个“线程同步解决火车站售票问题”的例子中,我们可以通过线程同步机制来实现售票的有序、无冲突的过程。 首先,我们需要理解问题的核心:10个售票处(线程)需要共享1000张票(资源),并且每卖出一张票,必须...

    VC++线程同步实例

    在这个“VC++线程同步实例”中,我们将探讨如何利用VC++(Visual C++)来实现线程间的同步,以避免数据竞争和其他并发问题。我们将基于一个生动的模拟——公交车运行时司机、售票员和乘客的交互来讲解。 首先,我们...

    Java多线程同步.pdf

    因此,在使用Java多线程同步机制时,需要小心避免这些问题的出现。 Java多线程同步机制在实际应用中的应用 Java多线程同步机制在实际应用中有很多应用,例如: * 在线银行系统中,使用Java多线程同步机制来确保...

    多线程及线程同步

    然而,多线程环境下也带来了一些问题,尤其是资源竞争和数据一致性问题,这些问题需要通过线程同步机制来解决。本文将详细介绍如何通过临界区、互斥内核对象、事件内核对象和信号量内核对象来实现线程同步。 1. ...

    线程同步的五种方法

    线程同步是多线程编程中的重要概念,用于协调多个并发执行的线程,确保它们在访问共享资源时不会产生竞态条件或数据不一致性。在Windows编程中,提供了多种线程同步机制,包括互斥量、临界区、原子操作、事件以及...

    操作系统线程同步算法

    操作系统中的线程同步是多线程编程中一个关键的概念,它确保了多个线程在访问共享资源时的正确性,防止数据竞争和其他并发问题。在Windows操作系统中,提供了多种线程同步机制,如临界区、事件、信号量以及互斥量等...

    3种多线程实现同步方法

    本篇文章将深入探讨三种在C++中实现多线程同步的方法:事件对象、关键代码段和互斥对象。 首先,我们来看**事件对象**。事件对象是一种信号机制,用于线程间通信和同步。在Windows API中,CreateEvent函数创建一个...

Global site tag (gtag.js) - Google Analytics