怎么理解Stringbuffer 是线程安全的 stringbuilder是线程不安全的

大地之子 2014-04-14 09:51:12
加精
怎么理解Stringbuffer 是线程安全的 stringbuilder是线程不安全的
HashMap不是线程安全的 HashTable是线程安全
一直不理解JAVA里的API的类说 哪个类是线程安全的 哪个类不安全 到底啥意思呢
...全文
43396 83 打赏 收藏 转发到动态 举报
写回复
用AI写文章
83 条回复
切换为时间正序
请发表友善的回复…
发表回复
able_li 2016-09-10
  • 打赏
  • 举报
回复
多线程时用StringBuffer .两者源码一个有 synchronized 。一个没有
纵骑横飞 2016-09-08
  • 打赏
  • 举报
回复
一句话简言: 就是你边遍历边修改会不会发生并发修改异常。
肃穆丶 2016-09-05
  • 打赏
  • 举报
回复
男女之事谈线程安全
nikyotensai 2016-09-05
  • 打赏
  • 举报
回复
引用 41 楼 sunbo624 的回复:
意思就是比如一个女的是那个stringbuffer对象 两个线程是两个男的 女的在床上躺着 你进去之后就把门锁上 等你俩完事儿了 你出来之后他才能进去 不能3P
沉醉的小五郎 2016-07-07
  • 打赏
  • 举报
回复
引用 76 楼 opuiy1 的回复:
线程安全就好比拉屎,很多人都抢位置,你抢到位置了就锁门,别人进不来,只有你拉完出来了,打开门锁出去洗手了,别人才能抢,效率低,要一个一个来。 线程不安全就是大家都挤一个坑里拉屎,不太好把,但是效率高。
都是人才
沉醉的小五郎 2016-07-07
  • 打赏
  • 举报
回复
引用 41 楼 sunbo624 的回复:
意思就是比如一个女的是那个stringbuffer对象 两个线程是两个男的 女的在床上躺着 你进去之后就把门锁上 等你俩完事儿了 你出来之后他才能进去 不能3P
乱世丶桃花 2015-09-06
  • 打赏
  • 举报
回复
引用 15 楼 u014039623 的回复:
[quote=引用 2 楼 w363403269 的回复:] 如果你写了一个全局范围的StringBuffer和StringBuilder...两个线程不能同时修改StringBuffer中的内容,而能同时修改StringBuilder中的东西
你好 你这句话说反了吧 既然StringBuffer线程是安全的 那么应该两个线程能同时修改StringBuffer的内容啊 StringBuilder不安全 所以不能用两个线程同时修改啊[/quote] 你这在说笑呢吧,线程安全,线程同步是什么意思先搞懂再说啊亲
opuiy1 2015-09-05
  • 打赏
  • 举报
回复
线程安全就好比拉屎,很多人都抢位置,你抢到位置了就锁门,别人进不来,只有你拉完出来了,打开门锁出去洗手了,别人才能抢,效率低,要一个一个来。 线程不安全就是大家都挤一个坑里拉屎,不太好把,但是效率高。
铁匠梁老师 2015-09-01
  • 打赏
  • 举报
回复
涉及到多线程访问修改就用线程安全的 否则就用普通的,提高点效率
sxiaobei 2015-08-30
  • 打赏
  • 举报
回复
你好,建议你看下他们的源码,主要是涉及到线程对StringBuilder和StringBuffer的操作: 举个例子,以Str ingBuilder和StringBuffer说吧,在源码中,StringBuilder和StringBuffer都是把append过来的实例,转化成为char,存储在父类的一个char数组里面,最后在toString的时候把这个char数组转换成为字符串,试想线程A和线程B共享一个StringBuilder :sb,当线程A和线程B,同时使用sb.append方法,当线程A将获取来的char放入,char数组的时候,肯定要修改char数组的当前位置吧,但是当线程A还没来的及,修改char当前位置的时候,线程B就把char写入了数组,这时char数组的位置还是没有被线程A修改过的,这时B的数据就会把A的数据覆盖掉,并且线程A和线程B,修改char数组当前位置的顺序,也不一定,所以可能造成,sb中,线程A和线程B的数据都混乱,这就是线程不安全的因素,凡是StringBuffer的方法是synchronized方法,那么修改char数组的时候肯定要,先对sb加锁,那么当线程B修改数据的时候,发现sb被锁定了,所以线程B会阻塞等待sb可用后才会去修改,因为有阻塞的因素,所以StringBuffer的效率在单线程下是没有StringBuilder效率高的。 而HashMap和HashTable则是一样的原理,只不过他们存储的方式是用数组挂链表的方式存储的,你看下源码就明白的,不知道帮到你没,谢谢
LittleFish_yozo 2015-08-30
  • 打赏
  • 举报
回复
线程是否安全看相关方法是否同步?
hkhyw 2015-08-28
  • 打赏
  • 举报
回复
学习了。。。
not_easy 2015-07-07
  • 打赏
  • 举报
回复
学习下
多木多多木 2015-07-06
  • 打赏
  • 举报
回复
StringBuffer实现了线程同步,StringBuilder没有。所以StringBuffer是线程安全的,StringBuilder不安全,但是StringBuffer因为实现了线程同步,在执行程序的时候多了一部判断锁,所以StringBuffer会比StringBuiler慢。
烈焰灬长弓 2015-04-22
  • 打赏
  • 举报
回复
引用 41 楼 sunbo624 的回复:
意思就是比如一个女的是那个stringbuffer对象 两个线程是两个男的 女的在床上躺着 你进去之后就把门锁上 等你俩完事儿了 你出来之后他才能进去 不能3P
Y才啊,瞬间秒懂了
qingyuan18 2014-09-19
  • 打赏
  • 举报
回复
线程安全:多个线程不会同时操作该类实例 线程非安全:多个线程同时操作该类实例,造成脏数据,跟数据库隔离机制类似
xxchao12 2014-09-19
  • 打赏
  • 举报
回复
好东西,正好看看。
cjd96 2014-06-24
  • 打赏
  • 举报
回复
引用 41 楼 sunbo624 的回复:
意思就是比如一个女的是那个stringbuffer对象 两个线程是两个男的 女的在床上躺着 你进去之后就把门锁上 等你俩完事儿了 你出来之后他才能进去 不能3P
这比喻神了
lliiqiang 2014-06-19
  • 打赏
  • 举报
回复
引用 62 楼 lliiqiang 的回复:
[quote=引用 41 楼 sunbo624 的回复:] 意思就是比如一个女的是那个stringbuffer对象 两个线程是两个男的 女的在床上躺着 你进去之后就把门锁上 等你俩完事儿了 你出来之后他才能进去 不能3P
不错,但是仍然会出现问题,如果女的生下孩子就不知道是哪个男的,这样就会出现并发冲突问题。 女的怀孕生下孩子相当于远程调用的回调过程,这个过程是随机的,仍然会有同步问题,而不是谁先上就先生谁的,唯一解决方法就是利用唯一标识:DNA去区别.[/quote] 因此自然同步或者系统同步只能保证功能本身同步,不能保证使用逻辑同步。上的过程只能一个男的,但是上 怀孕分娩却无法直接同步,只能自己去同步,看住自己的老婆.
lliiqiang 2014-06-19
  • 打赏
  • 举报
回复
引用 41 楼 sunbo624 的回复:
意思就是比如一个女的是那个stringbuffer对象 两个线程是两个男的 女的在床上躺着 你进去之后就把门锁上 等你俩完事儿了 你出来之后他才能进去 不能3P
不错,但是仍然会出现问题,如果女的生下孩子就不知道是哪个男的,这样就会出现并发冲突问题。 女的怀孕生下孩子相当于远程调用的回调过程,这个过程是随机的,仍然会有同步问题,而不是谁先上就先生谁的,唯一解决方法就是利用唯一标识:DNA去区别.
加载更多回复(59)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧