下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Java的多线程问题及处理方法

作者:课课家教育     来源: http://www.kokojia.com点击数:811发布时间: 2016-01-29 14:11:00

标签: java环境搭建java基础java操作系统

大神带你学编程,欢迎选课

  在java多线程编程中,这个是一个典型的临界资源问题,解决这个问题最基本,最简单的思路就是使用同步关键字synchronized。

Java的多线程问题及处理方法_java教材_java环境_课课家

  synchronized关键字是一个修饰符,可以修饰方法或代码块,其的作用就是,对于同一个对象(不是一个类的不同对象), 当多个线程都同时调用该方法或代码块时,必须依次执行,也就是说,如果两个或两个以上的线程同时执行该段代码时,如果一个线程已经开始执行该段代码,则另外一个线程必须等待这个线程执行完这段代码才能开始执行。就和在银行的柜台办理业务一样,营业员就是这个对象,每个顾客就好比线程,当一个顾客开始办理 时,其它顾客都必须等待,及时这个正在办理的顾客在办理过程中接了一个电话 (类比于这个线程释放了占用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--;

  }

  }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方法时,就为这个对象加上了一把锁,锁住了这个对象,别的线程在调用该方法时,发现了这把锁以后就继续等待下去了。

  }

  }

  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);

赞(5)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程