欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

浅谈synchronized方法对非synchronized方法的影响

程序员文章站 2024-04-01 19:03:28
stringbuilder是线程不安全的类。 stringbuffer是线程安全的,因为它里面的方法加了synchronized。 今天写了一段代码测试了一下:用循环开...

stringbuilder是线程不安全的类。

stringbuffer是线程安全的,因为它里面的方法加了synchronized。

今天写了一段代码测试了一下:用循环开启10个线程,调用stringbuffer(stringbuilder)的append追加1 到 10 。

结果预期一样:线程不安全的stringbuilder会漏掉一些数字,

public static void main(string[] args) throws interruptedexception {
  stringbuffer buffer = new stringbuffer();
  stringbuilder builder = new stringbuilder();
  // 开启十个线程,分别对buffer 和 builder 操作  
  for(int i = 0; i < 10; i++) {
   int j = i;
   new thread(new runnable() {
    public void run() {
     try {
      thread.sleep(500); //造成阻塞
     } catch (interruptedexception e) {
      e.printstacktrace();
     }
     builder.append(j);
    }
   }).start();
  }
  //等待以上操作完成
  thread.sleep(1000);
  // 打印结果
  system.out.println("builder:"+builder);
 }

浅谈synchronized方法对非synchronized方法的影响

线程安全的stringbuffer则追加了全部10个数字:

public static void main(string[] args) throws interruptedexception {
 stringbuffer buffer = new stringbuffer();
 stringbuilder builder = new stringbuilder();
 // 开启十个线程,分别对buffer 和 builder 操作  
 for(int i = 0; i < 10; i++) {
  int j = i;
  new thread(new runnable() {
   public void run() {
    try {
     thread.sleep(500); //造成阻塞
    } catch (interruptedexception e) {
     e.printstacktrace();
    }
    buffer.append(j);
   }
  }).start();
 }
 //等待以上操作完成
 thread.sleep(1000);
 // 打印结果
 system.out.println("buffer:"+buffer);
}

浅谈synchronized方法对非synchronized方法的影响

这时:如果我同时操作builder和buffer,且先调用buffer的append,这时每次操作因为builder和buffer在同一个线程,builder的方法因为buffer阻塞了线程而被变成“同步”的方法,同样append了10个数字

public static void main(string[] args) throws interruptedexception {
 stringbuffer buffer = new stringbuffer();
 stringbuilder builder = new stringbuilder();
 // 开启十个线程,分别对buffer 和 builder 操作  
 for(int i = 0; i < 10; i++) {
  int j = i;
  new thread(new runnable() {
   public void run() {
    try {
     thread.sleep(500); //造成阻塞
    } catch (interruptedexception e) {
     e.printstacktrace();
    }
    buffer.append(j);
    builder.append(j);
   }
  }).start();
 }
 //等待以上操作完成
 thread.sleep(1000);
 // 打印结果
 system.out.println("buffer:"+buffer);
 system.out.println("builder:"+builder);
}

浅谈synchronized方法对非synchronized方法的影响

以上这篇浅谈synchronized方法对非synchronized方法的影响就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。