快速业务通道

Java多线程及同步实现原理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-25
{     Thread.sleep(100);    }    catch(InterruptedException e)    {     System.out.println("Interrupted");    }   }  }  public static void main(String[] args)  {   TestThread testThread = new TestThread();   for(int i=0; i<5; i++)   //new Thread(testThread, "t" + i).start(); (1)   new Thread(new TestThread(), "t" + i).start(); (2) }}

运行结果为:

t0 : 0

t1 : 0

t2 : 0

t3 : 0

t4 : 0

t0 : 1

t1 : 1

t2 : 1

t3 : 1

t4 : 1

t0 : 2

t1 : 2

t2 : 2

t3 : 2

t4 : 2

t0 : 3

t1 : 3

t2 : 3

t3 : 3

t4 : 3

t0 : 4

t1 : 4

t2 : 4

t3 : 4

t4 : 4

由于代码(2)每次都是用一个新的TestThread对象来产生Thread对象的,所以产生出来的Thread对象是不同对象的线程,所以所有Thread对象都可同时访问run()函数。如果注释掉代码(2),并去掉代码(1)的注释,结果为:

t0 : 0

t0 : 1

t0 : 2

t0 : 3

t0 : 4

t1 : 0

t1 : 1

t1 : 2

t1 : 3

t1 : 4

t2 : 0

t2 : 1

t2 : 2

t2 : 3

t2 : 4

t3 : 0

t3 : 1

t3 : 2

t3 : 3

t3 : 4

t4 : 0

t4 : 1

t4 : 2

t4 : 3

t4 : 4

由于代码(1)中每次都是用同一个TestThread对象来产生Thread对象的,所以产生出来的Thread对象是同一个对象的线程,所以实现run()函数的同步。

Java多线程及同步实现原理(5)

时间:2007-11-05

二. 共享资源的同步

1. 同步的必要性

例4:

class Seq{  private static int number = 0;  private static Seq seq = new Seq();  private Seq() {}  public static Seq getInstance()  {   return seq;  }  public int get()  {   number++;     //(a)   return number;    //(b)  }}public class TestThread{  public static void main(String[] args)  {   Seq.getInstance().get();    //(1)   Seq.getInstance().get();    //(2)  }}

上面是一个取得序列号的单例模式的例子,但调用get()时,可能会产生两个相同的序列号:

当代码(1)和(2)都试图调用get()取得一个唯一的序列。当代码(1)执行完代码(a),正要执行代码(b)时,它被中断了并开始执行代码(2)。一旦当代码(2)执行完(a)而代码(1)还未执行代码(b),那么代码(1)和代码(2)就将得到相同的值。

2. 通过synchronized实现资源同步

2.1 锁标志

2.1.1 每个对象都有一个标志锁。当对象的一个线程访问了对象的某个synchronized数据(包括函数)时,这个对象就将被“上锁”,所以被声明为synchronized的数据(包括函数)都不能被调用(因为当前线程取走了对象的“锁标志”)。只有当前线程访问完它要访问的synchronized数据,释放“锁标志”后,同一个对象的其它线程才能访问synchronized数据。

2.1.2 每个class也有一个“锁标志”。对于synchronized static数据(包括函数)可以在整个class下进行锁定,避免static数据的同时访问。

例5:

class Seq{  private static int number = 0;  private static Seq seq = new Seq();  private Seq() {}  public static Seq getInstance(){ return seq; }  public synchronized int get()  {   //(1)   number++;   return number;  }}

例5在例4的基础上,把get()函数声明为synchronized,那么在同一个对象中,就只能有一个线程调用get()函数,所以每个线程取得的number值就是唯一的了。

Java多线程及同步实现原理(6)

时间:2007-11-05

例6:

class Seq{  private static int number = 0;  private static Seq seq = null;  private

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号