java中多线程的安全问题以及解决办法(2)

来源:互联网 发布:我知女人心配乐 编辑:程序博客网 时间:2024/06/14 23:52

2.使用同步函数来解决线程存在的问题:

1.明确哪些是多线程运行的代码;2.哪些是共享数据;3.明确哪些代码是多线程操作共享数据的。

public static void main(String[] args) {
 SynFunction stf=new SynFunction();
 new Thread(stf).start();
 new Thread(stf).start();
}

public class SynFunction implements Runnable{
   private int sum=0;
  // Object obj=new Object();
 public void run() {
  // TODO Auto-generated method stub
  //synchronized(obj){
  for(int k=0;k<3;k++){
   this.add(100);
  }
  //}
 }
 
 public void add(int m){
  
  sum+=m;
  System.out.println(Thread.currentThread().getName()+":"+sum);
 }

}

结果为:

Thread-0:200
Thread-0:300
Thread-0:400
Thread-1:200
Thread-1:500
Thread-1:600

出现和和谐的结果;

Thread-0:200
Thread-0:300
Thread-0:400
Thread-1:200
Thread-1:500
Thread-1:600

使用同步函数后:

publicclass SynFunctionimplements Runnable{

  privateintsum=0;

 // Objectobj=newObject();

   publicvoid run() {

      //TODO Auto-generatedmethod stub

      //synchronized(obj){//在此加同步代码块,相当于每一个线程得把各自的三次循环执行完之后其他线程才能执行。就变成了顺序执行。

      for(int k=0;k<3;k++){

          this.add(100);//同步函数使用的锁对象时this

      }

      //}

   }

   

   publicsynchronized void add(int m){

      

      sum+=m;

      try {

          Thread.sleep(1000);

      }catch (InterruptedException e) {

          //TODO Auto-generatedcatch block

          e.printStackTrace();

      }

      System.out.println(Thread.currentThread().getName()+":"+sum);

   }

 

}

结果为:

Thread-0:100

Thread-1:200

Thread-0:300

Thread-1:400

Thread-1:500

Thread-0:600

总结同步函数使用的锁对象时:this

3.静态同步函数使用的锁是:类名.class,该方法所在类的字节码文件。

public class FileRun implements Runnable{
   private  static int sum=0;
 public void run() {
  // TODO Auto-generated method stub
  for(int k=0;k<3;k++){
   add(100);
  }
 }
 
 public static  synchronized void add(int m){
  sum+=m;
  try {
   Thread.sleep(1000);
  } catch (InterruptedException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  System.out.println(Thread.currentThread().getName()+":"+sum);
 }

}

public static void main(String[] args) {
 FileRun fr=new FileRun();
 new Thread(fr).start();
 new Thread(fr).start();
}

结果为:

Thread-0:100
Thread-1:200
Thread-1:300
Thread-1:400
Thread-0:500
Thread-0:600


0 0
原创粉丝点击