Java实现多线程同步的方法有哪些

  介绍

这篇文章主要介绍了Java实现多线程同步的方法有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>一、为什么要线程同步

因为当我们有多个线程要同时访问一个变量或对象时,如果这些线程中既有读又有写操作时,就会导致变量值或对象的状态出现混乱,从而导致程序异常。举个例子,如果一个银行账户同时被两个线程操作,一个取100块,一个存钱100块。假设账户原本有0块,如果取钱线程和存钱线程同时发生,会出现什么结果呢?取钱不成功,账户余额是100。取钱成功了,账户余额是0。那到底是哪个呢?很难说清楚。因此多线程同步就是要解决这个问题。

<强>二,不同步时的代码

银行。java

package  threadTest;,/* *,   ,* @author  lixiaoxi    *大敌;   ,*/{public  class  Bank       private 才能int  count =0;//账户余额,//存才能钱,   public 才能;void  addMoney (int 钱){,   ,,,count  +=钱,,   ,,,System.out.println (System.currentTimeMillis() +“存进:“+钱),,   ,,},//才能取钱,   public 才能;void  subMoney (int 钱){,   ,,,如果(count-money  & lt;, 0) {,   ,,,,,System.out.println(“余额不足,),,   ,,,,,返回,,   ,,,},   ,,,count  -=钱,,   ,,,System.out.println (+ System.currentTimeMillis() +“取出:“+钱),,   ,,},//才能查询,   public 才能;void  lookMoney () {,   ,,,System.out.println(“账户余额:“+数),,   ,,},   }

SyncThreadTest。java

package  threadTest;,      {public  class  SyncThreadTest       public 才能;static  void 主要(String  args []) {,   ,,,final  Bank 银行=new 银行(),,      ,,,Thread  tadd=new 线程(new  Runnable (), {,      ,,,,,@Override    ,,,,,public  void 运行(),{,   ,,,,,,,//,TODO  Auto-generated  method  stub    ,,,,,,,,(真正的){,   ,,,,,,,,,try  {,   ,,,,,,,,,,,,thread . sleep (1000);   ,,,,,,,,,},catch  (InterruptedException  e), {,   ,,,,,,,,,,,//,TODO  Auto-generated  catch  block    ,,,,,,,,,,,e.printStackTrace (),,   ,,,,,,,,,},   ,,,,,,,,,bank.addMoney (100),,   ,,,,,,,,,bank.lookMoney (),,   ,,,,,,,,,System.out.println (“\ n");,      ,,,,,,,},   ,,,,,},   ,,,}),,      ,,,Thread  tsub =, new 线程(new  Runnable (), {,      ,,,,,@Override    ,,,,,public  void 运行(),{,   ,,,,,,,//,TODO  Auto-generated  method  stub    ,,,,,,,,(真正的){,   ,,,,,,,,,bank.subMoney (100),,   ,,,,,,,,,bank.lookMoney (),,   ,,,,,,,,,System.out.println (“\ n");,   ,,,,,,,,,try  {,   ,,,,,,,,,,,,thread . sleep (1000);   ,,,,,,,,,},catch  (InterruptedException  e), {,   ,,,,,,,,,,,//,TODO  Auto-generated  catch  block    ,,,,,,,,,,,e.printStackTrace (),,   ,,,,,,,,,},,,   ,,,,,,,},   ,,,,,},   ,,,}),,   ,,,tsub.start (),,      ,,,tadd.start (),,   ,,},      }

代码很简单,我就不解释了,看看运行结果怎样呢?截取了其中的一部分,是不是很乱,有些看不懂。

余额不足,   账户余额:0,      余额不足,   账户余额:100,      1441790503354存进:100,   账户余额:100,      1441790504354存进:100,   账户余额:100,      1441790504354取出:100,   账户余额:100,      1441790505355存进:100,   账户余额:100,      null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

Java实现多线程同步的方法有哪些