StringBuffer append 死锁

volatile和原子类及CAS、synchronized、Lock、死锁及其解决方式 volatile 阅读详情
public class Ss1 {

	/**
	* @param args
	*/
	public static void main(String args[]){
		Integer i = new Integer(50);
		StringBuffer sb = new StringBuffer("1234");
		MyThread mt1 = new MyThread(sb);
		mt1.start();
		synchronized(sb){
		//mt1.change();
		try {
			mt1.join();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}
	}
	public static void changeNumber(Integer i){
		i = 100;
	}

}
class MyThread extends Thread{
	StringBuffer sb;
	public MyThread(StringBuffer sb) {
		// TODO Auto-generated constructor stub
		this.sb = sb;
	}
	public void run(){
		sb.append("asdf");
	}
	public void change(){
		synchronized(sb){
		sb.append("adsf");
		}
	}
}
请问在main方法中synchronized锁住的是哪一个对象,sb还是mt1
为什么join()方法会造成死锁,而change方法不会造成死锁

在change()方法中synchronized锁住的是MyThread还是sb

answer:

synchronized锁住的不是对象,是后面{}里的代码块,就是后面的代码块对不同的线程是互斥的
每个对象(注意是对象,不是类)都有一个监视器(monitor),只能有一个线程获得,synchronized(obj)就是获得obj的监视器,第一个线程获得了,其它线程再执行synchronized(obj)想获得obj的监视器就只能等待第一个线程把后面的代码块执行后释放obj的监视器
mt1.join的意思是要当前线程等待mt1执行完成后才能继续执行
StringBuffer.append的声明:     public synchronized StringBuffer append(Object obj) ,它也是个同步方法,也需要获得当前对象的监视器
synchronized(sb) {   //当前线程获得sb的监视器
  mt1.join();               //当前线程等待mt1执行完
}
而mt1的run()方法里调用 sb.append,它需要获得sb的监视器,而它的监视器被主线程占用,只好等待主线程释放sb的监视器,所以主线程与mt1都在互相等待,只好死锁了


`StringBuilder`为什么是线程不安全的?那`StringBuffer`呢? 线程不安全:因其继承的append()等方法未同步,导致多线程下对value数组和count变量的竞态条件,表现为数据丢失、错乱或数组越界。线程安全:通过同步方法保证所有修改/读取操作互斥执行,避免竞态条件,同时通过优化toString()性能。选择依据:单线程用(性能优先),多线程共享用或(安全优先)。/** 存储字符的底层数组 *//** 当前已存储的字符数量(字符串长度) */int count;// ...其他方法这两个变量是临界资源:所有修改字符串的操作(如append。 阅读详情

相关推荐

BERTopic模型入门教程(附代码+参数调节)

BERTopic 是一种用于从文本数据中提取主题模型的新型方法。通过结合 BERT嵌入和传统的主题模型来生成语义丰富的主题。传统的主题模型(如LDA)主要依赖于词频矩阵,而 BERTopic 通过预训练语言模型生成高维语义嵌入来捕捉词语间的复杂关系,因此可以更好地处理上下文信息。BERTopic模型可以看作是创建其主题表示的一系列步骤。核心原理如下:就本质而言,BERTopic就是一个拼装框架,可以把每部分都替换成其他模型,只要完成任务即可。

m0_52069102的博客 1万+

Java 锁的优化策略 和 膨胀过程

引用文章https://www.cnblogs.com/twoheads/p/10148598.html 1. Java 锁的优化策略 和 膨胀过程 1.1 自旋锁 自选锁其实就是在拿锁时发现已经有线程拿了锁,自己如果去拿会阻塞自己,这个时候会选择进行一次忙循环尝试。也就是不停循环看是否能等到上个线程自己释放锁。这个问题是基于一个现实考量的:很多拿了锁的线程会很快释放锁。因为一般敏感的操作不会很多。当然这个是一个不能完全确定的情况,只能说总体上是一种优化。 举个例子就好比一个人要上厕所发现厕所里面有人,他可

Dim_Jerry的博客 509

Python 打包与发布陷阱:如何用 setuptools 和 PyInstaller 生成跨平台可执行文件?

使用。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1207

StringBuffer的append方法的注意事项(JAVA)

 关于StringBuffer对象的append方法介绍,在Ivor Horton所著的《Java 2 入门经典(JDK 5)》(英文名:Beginning Java 2,JDK 5 Edition)中第4章数组和字符串讲解中,第4.4小节(向StringBuffer对象增加其他内容)介绍了用append()方法追加子串的功能。原文提供例子如下:    StringBuffer buf

hwctl的专栏 7581

从仿真到流片:手把手教你优化65nm CMOS电荷泵的电流匹配与稳定性

本文详细介绍了在65nm CMOS工艺下优化电荷泵电流匹配与稳定性的工程实践指南。通过蒙特卡洛仿真、运放反馈结构版图技巧和全差分结构设计,实现优于1%的电流匹配精度和±2%以内的电流稳定性,特别针对current mismatch问题提供了有效的解决方案。

weixin_42522320的博客 416

JLINK/SWD/STLINK下载选项区别

摘要: 本文对比了JLINK/SWD/STLINK的6种下载模式:Normal(硬件复位)、Hot plug(无复位)、Under reset(持续复位后连接)、Software reset(软件复位)、Hardware reset(全复位)和Core reset(内核复位)。重点分析了各模式的操作逻辑、适用场景及注意事项,其中Under reset模式是解决SWD禁用/程序异常的首选方案。通过对比表归纳了复位范围、NRST操作等核心差异,并给出场景选择建议:排查连接问题优先选Under reset,常规调

亚洲程序员盟主得博客 395

2019年12月01日总结(Java StringBuffer 和 StringBuilder 类,java append方法)

1.Java StringBuffer 和 StringBuilder 类 当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。 和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。 StringBuilder 类在 Java 5 中被提出,它和 ...

DAO1024的博客 392

Windows11 下 Detectron2 的安装与配置全攻略

本文提供了在Windows11系统下安装和配置Detectron2的完整教程。详细介绍了从环境准备、创建虚拟环境、安装PyTorch与CUDA,到修改源码、编译安装以及运行验证Demo的全过程,帮助开发者克服Windows平台上的常见问题,成功部署这一强大的计算机视觉库。

weixin_29081703的博客 245

Java锁粗化与锁消除

锁粗化通常情况下,为了保证多线程间的有效并发,会要求每个线程持有锁的时间尽可能短,但是大某些情况下,一个程序对同一个锁不间断、高频地请求、同步与释放,会消耗掉一定的系统资源,因为锁的讲求、同步与释放本身会带来性能损耗,这样高频的锁请求就反而不利于系统性能的优化了,虽然单次同步操作的时间可能很短。锁粗化...

FYHannnnnn的博客 402

H3C交换机S-MLAG实战:如何用bond4模式实现服务器高可用(附避坑指南)

本文详细介绍了H3C交换机S-MLAG技术与服务器bond4模式的实战配置,帮助实现跨设备链路聚合的服务器高可用方案。通过解析S-MLAG技术优势、bond4模式选择、关键配置步骤及常见问题排查,提供了一套完整的避坑指南和优化建议,适用于企业级网络架构的高可用需求。

weixin_30790841的博客 465

使用ChIPSeeker进行ChIP-seq, ATAC-seq,cut&tag等富集峰的基因组注释

常规的下一代高通量测序(next generation sequencing, NGS)实验通常产生大量短片段(reads),通常我们需要将这些reads比对到参考基因组/转录组上,即将它们置于生物学上有意义的基因背景下,才能获得有意义的结果。一般我们认为会产生两种类型的数据(当然两者并无严格意义上的区分)

微生信 3318

Java多线程之浅谈死锁问题

Java多线程之浅谈死锁问题 死锁是java多线程中的一个重要内容,对于死锁的理解相当重要。 什么是死锁: 板正的官方定义为: 当多个线程分别占用其他线程所需要的同步资源,都在等待其他线程释放自己所需要的同步资源时,就形成了死锁。 这样的例子我们并不太好理解,请看如下的例子: 如上图,a,b两个小人,面前的桌上有一张桌子和两碗饭,但只有一双筷子,那么问题来了,每个人只能在有一双筷子的情况下才能吃饭,也就是a先拿筷子吃,再把筷子都给b,这样两人都能顺利的吃完饭。 那么死锁是什么情况呢?就是a拿着一支筷子,b

qq_45273552的博客 541

JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

【代码】JEDEC 标准半导体功率循环热阻测试(JESD51 系列)

专注于前沿技术的探索与实践,热衷于从代码逻辑、架构设计到行业应用等多维度深挖技术本质。期待在技术之路上与你共同成长~ 467

同步方法与同步块那个是更好选择

同步方法与同步块的区别,那个值得使用

tszc95的博客 290

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java多线程死锁问题测试

package testthread; public class TestDeadLock { static StringBuffer sb1 = new StringBuffer(); static StringBuffer sb2 = new StringBuffer(); public static void main(String[] args) { new Thread

sinat_38041033的博客 204

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

深入学习java源码之StringBuffer.append()与 StringBuffer.substring()

深入学习java源码之StringBuffer.append()与 StringBuffer.substring() synchronized关键字 线程运行时拥有自己的栈空间,会在自己的栈空间运行,如果多线程间没有共享的数据也就是说多线程间并没有协作完成一件事情,那么,多线程就不能发挥优势,不能带来巨大的价值。那么共享数据的线程安全问题怎样处理?很自然而然的想法就是每一个线程依次去读写这个共...

悦分享 891

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Java随笔之String,StringBuffer与StringBuilder类

String,StringBuffer与StringBuilder的区别 String对象的创建的两种不同 摘要:String类型的实例的是定长(一旦生成不可变)的字符串,String 字符串变量 直接赋值的话是 看做字符串常变量存储在 “永久代”中,且多个字符串相同的常变量共享一片内存。 字符串变量调用new String("") 来创建变量的时候是,因为调用了new 所以该变量存储在“新生代”,而且独自占用一片内存。jdk1.8之后永久代叫做元空间Metasspace ` String text1

qq_40694640的博客 227

StringBuffer类

一.StringBuffer 1.StringBuffer:线程安全的可变字符序列。 特点:线程安全----->不同步----->执行效率高,在开发中,线程不安全会造成死锁的现象 eg:银行的网站、医院的平台 线程(相对于进程而言)后续补充! 面试题:StringBuffer和String 的区别? StringBuffer会构造一个字符串缓冲区,从内存角度考虑,一般情况使用Strin

Luna_ll的博客 483

线程死锁问题

package com.yaspeed.threadnotice; /** * 测试线程死锁问题 * 问题分析:线程死锁的原因线程之间所需要的资源被对方占有不释放导致 * 例如:线程A有资源A1,线程B有资源B1,现在线程A占有A1的情况下,需要资源B1, * 线程B占有B1的情况下需要A1,最终导致死锁的产生 * @author wd */ public class TestDe

登高必自卑,涉远必自迩 275

java程序员从笨鸟到菜鸟之(十四)StringBuffer类

StringBuffer类 引言: 线程(想对于进程而言) 线程安全---->虽然同步---->但执行效率低! 举例: 银行的网站,医院的平台 线程不安全--->不同步--->执行效率高 举例: 一些论坛网站,相亲网站......... 在是开发中,线程不安全可能会造成死锁(备注)的现象! 说明:

wzj_110的博客 310

linux环境JVM内存死锁问题分析

JVM内存死锁问题分析

wh0426的专栏 1360

Java多线程锁机制:synchronized与ReentrantLock实战解析

在并发编程中,锁机制是确保线程安全的核心技术。Java提供了从基础的synchronized关键字到高级的ReentrantLock等多种同步方案。synchronized作为JVM内置锁,通过对象头实现锁状态管理,支持偏向锁、轻量级锁到重量级锁的升级过程,适合简单同步场景。而基于AQS实现的ReentrantLock则提供了更丰富的功能,包括可中断获取、公平锁选择、条件变量等高级特性,适用于高并发复杂场景。合理选择锁策略能显著提升系统吞吐量,如在电商秒杀系统中优化锁机制可使TPS提升数十倍。理解这些锁的实

weixin_33980459的博客 446

Java并发编程中的锁机制深度解析与实践指南

在多线程编程中,锁机制是确保线程安全的核心技术。从基本原理来看,锁通过控制对共享资源的访问顺序,解决了数据竞争问题。Java提供了从synchronized关键字到JUC包中多种锁实现的技术栈,开发者需要根据具体场景在安全性、活性和性能之间取得平衡。典型应用场景包括高并发Web服务、分布式系统和实时交易处理等。现代Java版本不断优化锁机制,如JDK15默认禁用偏向锁,Java8引入StampedLock等。对于Java开发者而言,深入理解ReentrantLock、读写锁等核心组件,掌握锁消除、锁粗化等J

weixin_30861459的博客 293

day11

StringTests 判断一个字符串是否是对称的 String类的compare()源码 线程(多线程中讲) 线程安全---->同步---->执行效率低!  举例: 银行的网站,医院的平台  线程不安全--->不同步--->执行效率高 举例: 一些论坛网站,相亲网站..  在是开发中,线程不安全可能会造成死锁的现象! 线程安全和执行效

densedog的博客 266

【031期】面试官问:为什么 StringBuilder 线程不是安全的?

>>号外:关注“Java精选”公众号,回复“面试资料”,免费领取资料!“Java精选面试题”小程序,3000+ 道面试题在线刷,最新、最全 Java 面试题!引言周五去面试又被...

Java精选 264
上一篇: 为什么Java中synchronized同步的对象不能是Integer等类型
下一篇: svn 命令行下常用的几个命令
大树叶
博客等级 码龄12年 1171粉丝 664原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值