Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java StringBuffer同步是如何工作的?_Java_Multithreading_Synchronization_Stringbuffer - Fatal编程技术网

Java StringBuffer同步是如何工作的?

Java StringBuffer同步是如何工作的?,java,multithreading,synchronization,stringbuffer,Java,Multithreading,Synchronization,Stringbuffer,大家好 我对StringBuffer以何种方式/在何种情况下同步并阻止多线程访问感到有点困惑。在下面的代码中,它打印出for循环中的字母A 100次,然后B 100次,以此类推。。。注释掉synchronized(sb){}部分,它就不再同步并且不工作了 那么StringBuffer是如何同步的。。。它将在什么限制下工作?有人能简单地解释一下吗?它必须是原子操作吗 谢谢 约翰 package threads.sync.ch13; 导入java.util.ArrayList; 导入java.uti

大家好

我对StringBuffer以何种方式/在何种情况下同步并阻止多线程访问感到有点困惑。在下面的代码中,它打印出for循环中的字母A 100次,然后B 100次,以此类推。。。注释掉synchronized(sb){}部分,它就不再同步并且不工作了

那么StringBuffer是如何同步的。。。它将在什么限制下工作?有人能简单地解释一下吗?它必须是原子操作吗

谢谢

约翰

package threads.sync.ch13;
导入java.util.ArrayList;
导入java.util.List;
类Ex13_2扩展了线程{
静态缓冲区sb;
//为某人做准备;
字符串s;
公共Ex13_2(StringBuffer sb){
这是;
}
公开募捐{
(某人){
//增加字母,然后打印100 X
替换(0,sb.length(),this.s);
对于(int i=0;i<100;i++){
系统输出打印(本sb);
}
System.out.println();
}
}
公共静态void main(字符串[]args){
//每个实例的单类缓冲区。。。
sb=新的字符串缓冲区(“”);
//创建多线程实例的数组
//然后开始运行它们。。。
列表e=新的ArrayList();

对于(char c='A';c首先,对于非共享使用,StringBuilder更优越(它是为此目的编写的……它完全不同步,因此速度更快)

返回StringBuffer。它的所有公共方法都是同步的,因此它在内部是“安全的”。但以下不是原子的:

StringBuffer sb = //get_sb_from_somewhere;
sb.append("foo").append("bar);
要使附件完全线程安全,请使用对象将使用的同一个锁将其包装在锁中。通常这只是对象,如此处所示,因此:

synchronized (sb) {
  sb.append("foo").append("bar);
}

您的run()方法在我看来很不错。

首先,对于非共享使用,StringBuilder更优越(它是为此目的编写的……它完全不同步,因此速度更快)

返回StringBuffer。它的所有公共方法都是同步的,因此它在内部是“安全的”。但以下不是原子的:

StringBuffer sb = //get_sb_from_somewhere;
sb.append("foo").append("bar);
要使附件完全线程安全,请使用对象将使用的同一个锁将其包装在锁中。通常这只是对象,如此处所示,因此:

synchronized (sb) {
  sb.append("foo").append("bar);
}

您的run()方法在我看来很不错。

首先,对于非共享使用,StringBuilder更优越(它是为此目的编写的……它完全不同步,因此速度更快)

返回StringBuffer。它的所有公共方法都是同步的,因此它在内部是“安全的”。但以下不是原子的:

StringBuffer sb = //get_sb_from_somewhere;
sb.append("foo").append("bar);
要使附件完全线程安全,请使用对象将使用的同一个锁将其包装在锁中。通常这只是对象,如此处所示,因此:

synchronized (sb) {
  sb.append("foo").append("bar);
}

您的run()方法在我看来很不错。

首先,对于非共享使用,StringBuilder更优越(它是为此目的编写的……它完全不同步,因此速度更快)

返回StringBuffer。它的所有公共方法都是同步的,因此它在内部是“安全的”。但以下不是原子的:

StringBuffer sb = //get_sb_from_somewhere;
sb.append("foo").append("bar);
要使附件完全线程安全,请使用对象将使用的同一个锁将其包装在锁中。通常这只是对象,如此处所示,因此:

synchronized (sb) {
  sb.append("foo").append("bar);
}

你的run()方法看起来不错。

StringBuilder中的每个方法都是线程安全的。
但是你是按顺序调用各种方法的。因此每个方法调用都是互斥的,而不是整个调用序列


通过将整个系列放入
synchronized(sb){}
块,可以使整个系列的调用相互排斥。

StringBuilder中的每个方法都是线程安全的。但是,您是按顺序调用各种方法的。因此,每个方法调用都是相互排斥的,而不是整个系列的调用


通过将整个系列放入
synchronized(sb){}
块,可以使整个系列的调用相互排斥。

StringBuilder中的每个方法都是线程安全的。但是,您是按顺序调用各种方法的。因此,每个方法调用都是相互排斥的,而不是整个系列的调用


通过将整个系列放入
synchronized(sb){}
块,可以使整个系列的调用相互排斥。

StringBuilder中的每个方法都是线程安全的。但是,您是按顺序调用各种方法的。因此,每个方法调用都是相互排斥的,而不是整个系列的调用


通过将整个系列放入
synchronized(sb){}
块,可以使整个系列调用相互排斥。

BrianT的回答触及了一个非常重要的问题。StringBuilder被认为是“线程安全的”因为,无论有多少线程试图同时访问同一个实例,也不管它们对该实例做了什么,它们都不能将该实例置于错误状态。但这并不总是意味着追加操作将按照您希望的顺序进行:您可能需要额外的同步,因为……构建一个程序完全脱离“线程安全”对象的ram不会使程序线程安全。BrianT的回答涉及到一个非常重要的问题。StringBuilder被认为是“线程安全的”因为,无论有多少线程试图同时访问同一个实例,也不管它们对该实例做了什么,它们都不能将该实例置于错误状态。但这并不总是意味着追加操作将按照您希望的顺序进行:您可能需要额外的同步,因为……构建一个程序完全脱离“线程安全”对象的ram不会使程序线程安全。BrianT的回答涉及到一个非常重要的问题。StringBuilder被认为是“线程安全”的,因为无论有多少线程试图同时访问同一实例,并且