中华考试网·阅读新闻
编程开发 > JAVA > 文章内容

java基础知识总结(13)

2016-1-13编辑:ljnbset

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

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

         }

}

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

java基础知识总结(12)
咨询热线:4000-525-585(免长途费)