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

 更新时间:2017年10月10日 09:00:52   作者:/*小神经*/  
下面小编就为大家带来一篇浅谈synchronized方法对非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);
 }

线程安全的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);
}

这时:如果我同时操作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方法的影响就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 通过jstack分析解决进程死锁问题实例代码

    通过jstack分析解决进程死锁问题实例代码

    这篇文章主要介绍了通过jstack分析解决进程死锁问题实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • MyBatis中select语句中使用String[]数组作为参数的操作方法

    MyBatis中select语句中使用String[]数组作为参数的操作方法

    在 MyBatis 中,如何在 mapper.xml 配置文件中 select 语句中使用 String[] 数组作为参数呢,并且使用IN关键字来匹配数据库中的记录,这篇文章主要介绍了MyBatis中select语句中使用String[]数组作为参数,需要的朋友可以参考下
    2023-12-12
  • java hashtable实现代码

    java hashtable实现代码

    这篇文章介绍了java hashtable实现代码,有需要的朋友可以参考一下
    2013-10-10
  • Java操作Mongodb数据库实现数据的增删查改功能示例

    Java操作Mongodb数据库实现数据的增删查改功能示例

    这篇文章主要介绍了Java操作Mongodb数据库实现数据的增删查改功能,结合完整实例形式分析了java针对MongoDB数据库的连接、增删改查等相关操作技巧,需要的朋友可以参考下
    2017-08-08
  • 解读@SelectProvider的使用方法

    解读@SelectProvider的使用方法

    这篇文章主要介绍了@SelectProvider的使用方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • Java实现发送邮件并携带附件

    Java实现发送邮件并携带附件

    这篇文章主要为大家详细介绍了Java实现发送邮件并携带附件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Spring Security 基于URL的权限判断源码解析

    Spring Security 基于URL的权限判断源码解析

    这篇文章主要介绍了Spring Security 基于URL的权限判断问题,我们想要实现自己的基于请求Url的授权只需自定义一个 AccessDecisionManager即可,接下来跟随小编一起看看实现代码吧
    2021-12-12
  • Java实现UDP互发消息

    Java实现UDP互发消息

    这篇文章主要为大家详细介绍了Java实现UDP互发消息,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-07-07
  • MyBatis-Plus中最简单的查询操作教程(Lambda)

    MyBatis-Plus中最简单的查询操作教程(Lambda)

    这篇文章主要给大家介绍了关于MyBatis-Plus中最简单的查询操作的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-03-03
  • SpringBoot启动后自动执行初始化任务的五种方法

    SpringBoot启动后自动执行初始化任务的五种方法

    在 Spring Boot 开发中,我们经常需要在应用启动后立即执行初始化任务,本文将深度解析 ​​5 种主流实现方案​​,大家可以根据自己的需求自行选择
    2025-04-04

最新评论