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

    作者:课课家教育更新于: 2016-01-29 14:11:00

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

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

课课家教育

未登录