服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - 浅谈synchronized方法对非synchronized方法的影响

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

2021-01-15 14:28/*小神经*/ Java教程

下面小编就为大家带来一篇浅谈synchronized方法对非synchronized方法的影响。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

stringbuilder是线程不安全的类。

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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个数字:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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个数字

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
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方法的影响就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:http://www.cnblogs.com/whatsoever/archive/2017/10/09/7643045.html

延伸 · 阅读

精彩推荐