Chinaunix首页 | 论坛 | 博客
  • 博客访问: 16494870
  • 博文数量: 5645
  • 博客积分: 9880
  • 博客等级: 中将
  • 技术积分: 68081
  • 用 户 组: 普通用户
  • 注册时间: 2008-04-28 13:35
文章分类

全部博文(5645)

文章存档

2008年(5645)

我的朋友

分类:

2008-04-28 21:41:51

下载本文示例代码
  同步经常作为断面被引用。断面是指一次只能有一个线程执行它。多个线程同时执行同步代码是有可能的。  这个误解是因为很多程序员认为同步关键字锁住了它所包围的代码。但是实际情况不是这样的。同步加锁的是对象,而不是代码。因此,如果你的类中有一个同步方法,这个方法可以被两个不同的线程同时执行,只要每个线程自己创建一个的该类的实例即可。   参考下面的代码: class Foo extends Thread {  private int val;  public Foo(int v)  {   val = v;  }  public synchronized void printVal(int v)  {   while(true)    System.out.println(v);  }  public void run()  {   printVal(val);  } }class SyncTest {  public static void main(String args[])  {   Foo f1 = new Foo(1);   f1.start();   Foo f2 = new Foo(3);  f2.start();  } }   运行SyncTest产生的输出是1和3交叉的。如果printVal是断面,你看到的输出只能是1或者只能是3而不能是两者同时出现。程序运行的结果证明两个线程都在并发的执行printVal方法,即使该方法是同步的并且由于是一个无限循环而没有终止。  要实现真正的断面,你必须同步一个全局对象或者对类进行同步。下面的代码给出了一个这样的范例。 class Foo extends Thread {  private int val;  public Foo(int v)  {   val = v;  }  public void printVal(int v)  {   synchronized(Foo.class) {    while(true)    System.out.println(v);   }  }  public void run()  {   printVal(val);  } }   上面的类不再对个别的类实例同步而是对类进行同步。对于类Foo而言,它只有唯一的类定义,两个线程在相同的锁上同步,因此只有一个线程可以执行printVal方法。  这个代码也可以通过对公共对象加锁。例如给Foo添加一个静态成员。两个方法都可以同步这个对象而达到线程安全。共2页。 1 2 :   同步经常作为断面被引用。断面是指一次只能有一个线程执行它。多个线程同时执行同步代码是有可能的。  这个误解是因为很多程序员认为同步关键字锁住了它所包围的代码。但是实际情况不是这样的。同步加锁的是对象,而不是代码。因此,如果你的类中有一个同步方法,这个方法可以被两个不同的线程同时执行,只要每个线程自己创建一个的该类的实例即可。   参考下面的代码: class Foo extends Thread {  private int val;  public Foo(int v)  {   val = v;  }  public synchronized void printVal(int v)  {   while(true)    System.out.println(v);  }  public void run()  {   printVal(val);  } }class SyncTest {  public static void main(String args[])  {   Foo f1 = new Foo(1);   f1.start();   Foo f2 = new Foo(3);  f2.start();  } }   运行SyncTest产生的输出是1和3交叉的。如果printVal是断面,你看到的输出只能是1或者只能是3而不能是两者同时出现。程序运行的结果证明两个线程都在并发的执行printVal方法,即使该方法是同步的并且由于是一个无限循环而没有终止。  要实现真正的断面,你必须同步一个全局对象或者对类进行同步。下面的代码给出了一个这样的范例。 class Foo extends Thread {  private int val;  public Foo(int v)  {   val = v;  }  public void printVal(int v)  {   synchronized(Foo.class) {    while(true)    System.out.println(v);   }  }  public void run()  {   printVal(val);  } }   上面的类不再对个别的类实例同步而是对类进行同步。对于类Foo而言,它只有唯一的类定义,两个线程在相同的锁上同步,因此只有一个线程可以执行printVal方法。  这个代码也可以通过对公共对象加锁。例如给Foo添加一个静态成员。两个方法都可以同步这个对象而达到线程安全。共2页。 1 2 : 下载本文示例代码


Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面Java走下神坛之同步代码等同于断面
阅读(176) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~