快速业务通道

Java编程那些事儿98——多线程问题及处理1 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-24
个线程已经开始执行该段代码,则另外一个线程必须等待这个线程执行完这段代码才能开始执行。就和在银行的柜台办理业务一样,营业员就是这个对象,每个顾客就好比线程,当一个顾客开始办理时,其它顾客都必须等待,及时这个正在办理的顾客在办理过程中接了一个电话 (类比于这个线程释放了占用CPU的时间,而处于阻塞状态),其它线程也只能等待。

使用synchronized关键字修改以后的上面的代码为:

package syn2; /** * 模拟临界资源的类 */ public class Data2 {  public int n;  public Data2(){   n = 60;  }  public synchronized void action(String name){   System.out.println(name + ":" + n);   n--;  } } package syn2; /** * 测试多线程访问时的问题 */ public class TestMulThread2 {  public static void main(String[] args) {   Data2 data = new Data2();   Data2Thread d1 = new Data2Thread(data,"线程1");   Data2Thread d2 = new Data2Thread(data,"线程2");  } } package syn2; /** * 访问数据的线程 */ public class Data2Thread extends Thread {  Data2 data;  String name;  public Data2Thread(Data2 data,String name){   this.data = data;   this.name = name;   start();  }  public void run(){   try{    for(int i = 0;i < 10;i++){     data.action(name);     Thread.sleep(200);    }   }catch(Exception e){}  } }

该示例代码的执行结果会出现不同,一种执行结果为:

线程1:60 线程2:59 线程2:58 线程1:57 线程2:56 线程1:55 线程2:54 线程1:53 线程2:52 线程1:51 线程2:50 线程1:49 线程1:48 线程2:47 线程2:46 线程1:45 线程2:44 线程1:43 线程2:42 线程1:41

在该示例中,将打印变量n的代码和变量n变化的代码组成一个专门的方法action,并且使用修饰符synchronized修改该方法,也就是说对于一个Data2的对象,无论多少个线程同时调用action方法时,只有一个线程完全执行完该方法以后,别的线程才能够执行该方法。这就相当于一个线程执行到该对象的synchronized方法时,就为这个对象加上了一把锁,锁住了这个对象,别的线程在调用该方法时,发现了这把锁以后就继续等待下去了。

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号