StringBuffer 和StringBuilder的问题?难解

2019-03-25 13:52|来源: 网路

我知道这两个   一个是线程安全的,另一个是线程不安全的,
问题是,如何用这两个写出线程不安全的代码
又如何写出线程安全的代码?

问题补充:
牟盖东 写道
所谓线程安全,就是StringBuffer类在设计的时候,就考虑到一个实例被多个线程访问的时候存在同时改写的可能,为此加入同步机制(synchronized),以协调多个线程对共享资源的互斥写入。仅此而已

阁下之所以问这个问题,我想你一般是没有写过几个多线程的程序,多了解一下多线程或许您可以豁然开朗的。



我确实没写过多线程的程序。   看看什么书呢?

相关问答

更多
  • 在Java 1.5的新代码中通常应该使用StringBuilder - 这是非常罕见的,您真的需要以线程安全的方式构建字符串,因此为什么要支付同步成本? 我怀疑你使用StringBuffer看到的代码大部分都是以下的桶: 在Java 1.5之前编写 以保持与旧版JDK的兼容性 由不了解StringBuilder人写的 由不了解StringBuilder工具自动生成 It's obsolete in that new code on Java 1.5 should generally use StringBu ...
  • StringBuffer是同步的, StringBuilder不是。 StringBuffer is synchronized, StringBuilder is not.
  • 可变性差异: String是不可变的 ,如果您尝试更改其值,则会创建另一个对象,而StringBuffer和StringBuilder是可变的,因此可以更改其值。 线程安全差异: StringBuffer和StringBuilder之间的区别是StringBuffer是线程安全的。 所以当应用程序只需要在一个线程中运行时,最好使用StringBuilder 。 StringBuilder比StringBuffer更有效。 情况: 如果你的字符串不会改变使用String类,因为String对象是不可变的。 如 ...
  • 注意这个答案最近受到一些关注。 我不是主张这个解决方案(这是我以前在STL之前看到的一个解决方案)。 这是一个有趣的方法,只能在std::string或std::stringstream如果在分析您的代码后,发现这会有所改进。 我通常使用std::string或std::stringstream 。 我从来没有遇到任何问题。 如果事先知道字符串的大小,我通常会先预留一些房间。 我已经看到其他人在遥远的过去使自己的优化字符串构建器。 class StringBuilder { private: std ...
  • StringBuilder中的一些方法是同步的,而StringBuilder不是线程安全的 - 并且速度更快。 规则 - 使用StringBuilder,除非你有一个用例,其中一个StringBuilder被多个Thread使用(这将是一个非常罕见的情况)。 Some methods in StringBuffer are synchronized while StringBuilder is not thread-safe - and faster. Rule of a thumb - use Strin ...
  • 即使大多数实例不是跨线程使用,因为实例可能会有一些小的开销获取和释放无连接的锁,并且锁定elision在StringBuffer中不起作用。 请参阅http://book.javanb.com/java-threads-3rd/jthreads3-CHP-5-SECT-1.html以获取虚拟机在获取和释放锁时必须执行的操作。 There is some small overhead acquiring and releasing even an uncontended lock, and lock elis ...
  • 这样做会带来哪些优势/优化? 我认为这样做没有任何优势。 我的建议是选择比预期尺寸稍大的初始尺寸......如果你有一个适度的好估计。 如果你没有估算的话,通过提供一个初始尺寸你将不会获得太多收益。 使用明显高估的初始大小不是一个好主意。 它浪费了空间,而且JVM将不得不将所有那些在某些耗费CPU /内存周期的地方使用的字符清零。 [应该可以根据经验确定低估和高估尺寸的成本,并与使用默认初始尺寸的成本进行比较。 然而,这些数字可能取决于JIT优化器的性能如何,以及诸如内存复制速度有多快与可以将其复位速度有多 ...
  • 这是一个警告,而不是一个错误。 Sonar的工作是警告你, 因为 StringBuilder 速度更快,所以它是可取的。 如果API迫使你使用StringBuffer那么我会使用它并使警告消失。 我认为Pattern和两个缓冲区的真正潜在问题是StringBuffer和StringBuilder没有共享用于构建字符串的特定接口( Appendable是一个更通用的接口,我认为它们应该共享一个更具体的接口来构造字符串,比如StringConstructor ) ,这将允许您通过零努力切换实施(通常)。 It' ...
  • 这一切都是在一个线程中完成的,所以是的, StringBuilder很好(但是看看关于是否适合以这种方式构造SQL的评论)。 每当你有一系列这样的步骤,你创建一个局部变量,然后永远不会将对它的引用传递给任何其他方法,你永远不会返回它,你可以确定只有当前的线程可以访问它。 (通常,如果你将某些东西传递给另一个帖子,你就会意识到这就是你正在做的事情。) This is all being done in a single thread, so yes, a StringBuilder is fine (but ...
  • 每个类都可以选择以自己的方式计算哈希码。 散列码没有意义,而且非常简单的规则(缩写): equals()返回true的对象必须返回相同的哈希码。 equals()返回false的对象应返回不同的哈希代码,以达到类的最佳能力,以确保哈希表(如HashMap和HashSet更好性能。 由于值为"ABC"的String和值为"ABC"的StringBuilder不相等 ,因此不要求它们返回相同的哈希码。 如果从StringBuilder提取String值,那么该字符串值必须与具有相同值的另一个字符串具有相同的哈希 ...