Java开发多线程同步技巧

在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题。在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用。 我们首先编写一个非常简单的多线程的程序,是模拟银行中的多个线程同时对同一个储蓄账户进行存款、取款操作的。

在程序中我们使用了一个简化版本的Account类,代表了一个银行账户的信息。在主程序中我们首先生成了1000个线程,然后启动它们,每一个线程都对John的账户进行存100元,然后马上又取出100元。这样,对于John的账户来说,最终账户的余额应该是还是1000元才对。然而运行的结果却超出我们的想像,首先来看看我们的演示代码:

class Account
{
  String name; float amount;
  public Account(String name, float amount)
  {
   this.name = name;
   this.amount = amount;
  }
 
  public void deposit(float amt)
  {
   float tmp = amount;
   tmp += amt;
   try
   {
    Thread.sleep(100);
    //模拟其它处理所需要的时间,比如刷新数据库等
   }
   catch (InterruptedException e)
   {
    // ignore
   }
   amount = tmp;
  }
  public void withdraw(float amt)
  {
   float tmp = amount;
   tmp -= amt;
   try
   {
    Thread.sleep(100);
    //模拟其它处理所需要的时间,比如刷新数据库等
   }
   catch (InterruptedException e)
   {
    // ignore
   }
   amount = tmp;
  }
  public float getBalance()
  {
   return amount;
  }
}
public class AccountTest
{
  private static int NUM_OF_THREAD = 1000;
  static Thread[] threads = new Thread[NUM_OF_THREAD];
  public static void main(String[] args)
  {
   final Account acc = new Account("John", 1000.0f);
   for (int i = 0; i< NUM_OF_THREAD; i++)
   {
    threads[i] = new Thread(new Runnable()
    {
     public void run()
     {
      acc.deposit(100.0f);
      acc.withdraw(100.0f);
     }
    }
   );
   threads[i].start();
  }
  for (int i=0; i<NUM_OF_THREAD; i++)
  {
   try { threads[i].join();
   //等待所有线程运行结束
  }
  catch (InterruptedException e)
  {
   // ignore
  }
}
System.out.println("Finally, John's balance is:" + acc.getBalance()); }}

时间: 2024-10-03 09:01:37

Java开发多线程同步技巧的相关文章

Java开发 Eclipse使用技巧(转)

1.如何设置默认的代码目录为src,默认的输出目录为bin? window->Preferences->java->Buil Path中,右侧选择Folders就可以 2.如何为快速局部变量设置getX,setX属性?在代码里->右键->source->Generae Getters and Setters,然后在弹出的对话框里,把要加的属性前打勾 3.快速增加try-catch语句块光标放到出错行,然后ctrl+1,在下拉列表里选择 4.eclipse保存时自动编译,

java-Java中多线程同步锁报无效指针异常是何原因,求大神解答!

问题描述 Java中多线程同步锁报无效指针异常是何原因,求大神解答! /* 需求: 使用lock接口实现商品的生产和销售的动态平衡 思路: 1.创建被共同操作的数据类Resource,并通过多态引用分别创建lock和condition子类对象以及资源的获取和赋值方法 2.创建两个相反操作即生产和销售的类同时实现Runnable接口,并覆盖run方法 3.在主函数中,创建资源对象,并作为共同参数分别传递给生产和销售两个线程实现类的构造函数 4.分别将生产和销售类的对象作为参数,传给两个线程,并各自

Java 并发/多线程教程(十二)-JAVA同步块

本系列译自jakob jenkov的Java并发多线程教程,个人觉得很有收获.由于个人水平有限,不对之处还望矫正! 一个Java同步块标记一个方法或一个代码块作为同步.可以使用Java同步块来避免竞态条件. java同步关键字       在Java中同步的块被标记为Synchronized关键字.Java中的同步块在某些对象上是同步的.在同一对象上同步的所有同步块只能在同一时间内执行一个线程.所有试图进入同步块的其他线程都被阻塞,直到同步块中的线程退出该块. Synchronized关键字可以

基于Java回顾之多线程同步的使用详解_java

首先阐述什么是同步,不同步有什么问题,然后讨论可以采取哪些措施控制同步,接下来我们会仿照回顾网络通信时那样,构建一个服务器端的"线程池",JDK为我们提供了一个很大的concurrent工具包,最后我们会对里面的内容进行探索. 为什么要线程同步? 说到线程同步,大部分情况下, 我们是在针对"单对象多线程"的情况进行讨论,一般会将其分成两部分,一部分是关于"共享变量",一部分关于"执行步骤". 共享变量 当我们在线程对象(Run

Java多线程同步问题的探究(一、线程的先来后到)

众所周知,在Java多线程编程中,一个非常重要的方面就是线程的同步问题. 关于线程的同步,一般有以下解决方法: 1. 在需要同步的方法的方法签名中加入synchronized关键字. 2. 使用synchronized块对需要进行同步的代码段进行同步. 3. 使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象. 另外,为了解决多个线程对同一变量进行访问时可能发生的安全性问题,我们不仅可以采用同步机制,更可以通过JDK 1.2中加入的 ThreadLocal

Java多线程同步中的两个特殊类

Java语言内置了synchronized关键字用于对多线程进行同步,大大方便了Java中多线程程序的编写.但是仅仅使用synchronized关键字还不能满足对多线程进行同步的所有需要.大家知道,synchronized仅仅能够对方法或者代码块进行同步,如果我们一个应用需要跨越多个方法进行同步,synchroinzed就不能胜任了.在C++中有很多同步机制,比如信号量.互斥体.临届区等.在Java中也可以在synchronized语言特性的基础上,在更高层次构建这样的同步工具,以方便我们的使用

使用java开发facebook网站应用程序技巧

丹尼尔 写于 2007年7月25日 当你想用Java写一Facebook的应用?你把在facebook的帐号中加入的程序开发模块,下载了相关的java类库.忽然你发现不得不停下来:开发相关的入门介绍,样例代码和文档说明在哪儿?这样的挫败感令人愤怒,而最终导致你不得不放弃. "我觉得缺乏良好的Java开发相关的说明文档是令人不安的" . 但愿有人会尽快写一个不错的应用Java 开发facebook应用的入门指南.也许只需要你给我些好吃的巧克力,我们可以写些相关的介绍文档,老实说我们的确也

java多线程同步问题,小弟百撕不得其解,特来求助!

问题描述 java多线程同步问题,小弟百撕不得其解,特来求助! 多线程共享同一资源,同一张票卖出了多张!同步方法,同步代码块都没用. 问题:编写三各类Ticket.SealWindow.TicketSealCenter分别代表票信息.售票窗口.售票中心.售票中心分配一定数量的票,由若干个售票窗口进行出售,利用你所学的线程知识来模拟此售票过程. public class ThreadDemo { public static void main(String[] args) { Thread t1

java多线程同步的问题

问题描述 java多线程同步的问题 小测试,如何实现变量ticket的同步 private int ticket = 100; public void run() { while(ticket > 0 ) { System.out.println(ticket+" is saled by "+ Thread.currentThread().getName()); ticket--; try { Thread.sleep(200); } catch (InterruptedExce