知识大全 Java中的同步——示例程序

Posted

篇首语:知识虽宝贵,但更可贵的却在于运用。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 Java中的同步——示例程序相关的知识,希望对你有一定的参考价值。

Java中的同步——示例程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  前面说到了Java中的同步问题 下面通过一个小小的实例程序来演示Java中的同步方法 其中对前文提到的Counter类做了稍微的修改

  public class Counter

  private int c = ;

  public void increment()

  System out println( before increment c = + c);

  c++;

  try

  Thread sleep( );

   catch (InterruptedException e)

  e printStackTrace();

  

  System out println( after increment c = + c);

  

  public  void decrement()

  System out println( before decrement c = + c);

  c ;

  try

  Thread sleep( );

   catch (InterruptedException e)

  e printStackTrace();

  

  System out println( after decrement c = + c);

  

  public int value()

  return c;

  

  

  在上面的Counter类的实现中 分别对increment和decrement方法中增加了sleep( )的调用 这样做的目的是为了放大两个线程对同一对象的方法调用时的交错效果

  下面是两个线程 在ThreadA中调用了 次increment()方法 在ThreadB中调用了 次decrement()方法

  Thread

  public class ThreadA implements Runnable

  private Counter c;

  public ThreadA(Counter c)

  this c = c;

  

  @Override

  public void run()

  for (int i = ; i < ; i++)

  this c increment();

  

  

  

  ThreadB

  public class ThreadB implements Runnable

  private Counter c;

  public ThreadB(Counter c)

  this c = c;

  

  @Override

  public void run()

  for (int i = ; i < ; i++)

  this c decrement();

  

  

  

  主程序如下 其中生成了两个线程threadA和ThreadB 他们共享Counter c

  public class Main

  public static void main(String[] args)

  Counter c = new Counter();

  ThreadA a = new ThreadA(c);

  ThreadB b = new ThreadB(c);

  Thread threadA = new Thread(a);

  Thread threadB = new Thread(b);

  threadA start();

  threadB start();

  

  

  执行上面的代码 可能的结果如下

  before increment c =

  before decrement c =

  after increment c =

  before increment c =

  after decrement c =

  before decrement c =

  after increment c =

  before increment c =

  after decrement c =

  before decrement c =

  after increment c =

  before increment c =

  after decrement c =

  before decrement c =

  after increment c =

  before increment c =

  after decrement c =

  before decrement c =

  after increment c =

  before increment c =

  after decrement c =

  before decrement c =

  after increment c =

  before increment c =

  after increment c =

  before increment c =

  after decrement c =

  before decrement c =

  after decrement c =

  before decrement c =

  after increment c =

  before increment c =

  after increment c =

  before increment c =

  after decrement c =

  before decrement c =

  after increment c =

  after decrement c =

  before decrement c =

  after decrement c =

  从上面的输出结果中我们不难看出出现了严重的交错现象! 在increment或者是decrement方法中输出before和after本应该是成对连续出现的 但输出结果却不是如此

  将上面代码的increment()和decrement()方法用synchronized 修饰后 重新运行该程序 输出结果如下

  before increment c =

  after increment c =

  before increment c =

  after increment c =

  before decrement c =

  after decrement c =

  before increment c =

  after increment c =

  before decrement c =

  after decrement c =

  before decrement c =

  after decrement c =

  before decrement c =

  after decrement c =

  before decrement c =

  after decrement c =

  before increment c =

  after increment c =

  before decrement c =

  after decrement c =

  before decrement c =

  after decrement c =

  before decrement c =

  after decrement c =

  before decrement c =

  after decrement c =

  before increment c =

  after increment c =

  before decrement c =

  after decrement c =

  before increment c =

  after increment c =

  before increment c =

  after increment c =

  before increment c =

  after increment c =

  before increment c =

  after increment c =

  before increment c =

  after increment c =

  这样输出结果和没有增加synchronized修饰符时的大不相同 单独一次的increment和decrement方法并没有出现交错的现象 只是连续 次的increment()和decrement ()有交错(这个不是synchronized能解决的问题)

  至少 我们从上面的实例程序中可以看到synchronized方法的作用了

cha138/Article/program/Java/hx/201311/26369

相关参考

知识大全 c#(Socket)同步套接字代码示例

c#(Socket)同步套接字代码示例  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  同步客户端

知识大全 jodd使用示例

  [java]  JODD中的时间操作类  [java]  packagexiaochentestjodd;  importjavautilTimeZone;  importapachelogjLo

知识大全 java阻塞队列 线程同步合作

  Queue接口与ListSet同一级别都是继承了Collection接口LinkedList实现了Queue接口Queue接口窄化了对LinkedList的方法的访问权限(即在方法中的参数类型如果

知识大全 Java中的“五子棋”游戏程序

Java中的“五子棋”游戏程序  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  importjav

知识大全 Java程序中的多线程

Java程序中的多线程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一为什么会排队等待?  下

知识大全 Java 程序中的多线程(四)

Java程序中的多线程(四)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者NeelVKum

知识大全 Java 程序中的多线程(二)

Java程序中的多线程(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者NeelVKum

知识大全 Java 程序中的多线程(一)

Java程序中的多线程(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者NeelVKum

知识大全 谈谈各种JAVA中的调用程序方式

谈谈各种JAVA中的调用程序方式  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  很多书籍都说Ja

知识大全 Java数据库程序中的存储过程设计

Java数据库程序中的存储过程设计  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  本文阐述了怎么