100求测试String线程不安全的测试程序 老早就听说String不是线程安全的,而StringBuffer是线程安全的,今天突然想起了,很想写个测试程序验证一下,但未能写出(写出来但未能体现不安全),特求此程序!希望牛们能给我一个完整的测试程序,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 你这个问题都不对的吧,String,StringBuffer,StringBuilder, 我认为线程安全主要是针对那些需要维护内部状态改变的类。而java的String 是不可变的,他的所有操作都不会对他的状态进行修改,有的操作是重新创建一个String对象,所以我觉得 说String是否线程安全不合适 String不是线程安全的?String是个final类,对于线程的设计模式来说就是Immutable模式,所以是不可能线程不安全的。 我想lz应该是问关于StringBuffer和StringBuilder的问题吧StringBuffer类是安全的,一般用于多线程。而StringBuilder类则不确定安全...,一般用于单线程,sun公司把这个StringBuilder加进来主要是考虑到多线程牺牲了性能,故提供一个StringBuilder提高效率是用的 为了能够在复制字符串里,获得较高的性能,所以,一般的string都用了引用计数实现。但是,对于多线程来说,引用计数就是一个全局变量。所以,如果在实现过程中,如果没有考虑多线程,那么在多线程间共享string就会出问题的。 String是不可变的,所以所有String的方法返回值应该都是固定的。这样不会有线程问题的。其实你是想比较StringBuffer和StringBuilder吧?不需要怎么比较,看看他们代码就知道啦,StringBuffer的方法带有synchronized public synchronized StringBuffer append(Object obj) { super.append(String.valueOf(obj)); return this; }StringBuilder的方法是不带synchronized的。 public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } public StringBuilder append(String str) { super.append(str); return this; } 答:我想对楼主说:你要求的代码是不存在的。请楼主记住:所有的Immutable对象(即:状态不能改变的对象)是线程安全的。因此:除了String的对象外,其它的如:Integer类的对象,BigDecimal类的对象,BigInteger类的对象等都是Immutable对象,都是线程安全的。 同意6楼的观点这些程序是书本上的,是多线程模式中的Single Thread Execution,不过不是关于String不安全的。自己看看下面的程序,public class UserThread extends Thread {private final Gate gate;private final String myname;private final String myaddress;public UserThread(Gate gate,String myname,String myaddress){this.gate=gate;this.myname=myname;this.myaddress=myaddress;}public void run(){ System.out.println(myname+"BEGIN"); while(true) { gate.pass(myname,myaddress); }}}安全的线程,不安全的已注释public class Gate{private int counter=0;private String name="nobody";private String address="nowhere";public synchronized void pass(String name,String address)//public void pass(String name,String address){this.counter++;this.name=name;this.address=address;check();}public synchronized String toString()//public String toString(){return "No"+counter+":"+name+","+address;}private void check(){if(name.charAt(0)!=address.charAt(0)){ System.out.println("**** BROKEN****"+toString());}}}测试程序如下:public class Main { public static void main(String [] agrs) { System.out.println("testing gate,press CTRL+C to stop"); Gate gate=new Gate(); new UserThread(gate,"alice","alssk").start(); new UserThread(gate,"bob","braiz").start(); new UserThread(gate,"cici","china").start(); }} 顶,这个才是正解, immutable对象不存在线程安全问题, 你无法改写其对象, 所以,不会存在读写冲突。 楼主的问题真的很屌啊。String的对象,本身是线程安全的啊。11楼说的没错,哈哈。StringBuilder不是线程安全的,而且他和StringBuffer所实现的接口都相同,所以,可以通过同一个套方法进行类比测试。 再帮LZ补充一下, 关于线程安全, 可以看看《Effective java》中第五十二条, 线程安全性得文档化,其中讲述了“线程安全”是分级别的,不是存在Synchronize就是安全了: 具体有:1. immutable, 这个是排在第一, 表明变成无需对其进行同步2. thread-safe, 类可变, 但方法Synchronize了, 所以无需同步3. conditionly thread-safe。有兴趣可以看看, 帮助理解同步, 因为这个问题跟身边的朋友讨论时,也产生了较大争议,这个可能对你有帮助。 初学java,有个问题想请教各位 请教大家关于jdbc的问题 有没有人知道可以告诉我,jTextFiel的文本发生改变事件是从什么时候开始? Collections.synchronized 有个简单的问题? 200分,帮忙编一个小游戏 Java正则表达式怎么验证输入的值必须为数字,不能为空,数值 <1000??? java虚拟机的问题 高分请教日文系统下的中文输入问题 JNaive callback 回调函数的问题? PowerDesigner 关于数据库唯一性
而java的String 是不可变的,他的所有操作都不会对他的状态进行修改,有的操作是重新创建一个String对象,所以我觉得 说String是否线程安全不合适
StringBuffer类是安全的,一般用于多线程。而StringBuilder类则不确定安全...,一般用于单线程,sun公司把这个StringBuilder加进来主要是考虑到多线程牺牲了性能,故提供一个StringBuilder提高效率是用的
super.append(String.valueOf(obj));
return this;
}StringBuilder的方法是不带synchronized的。
public StringBuilder append(Object obj) {
return append(String.valueOf(obj));
} public StringBuilder append(String str) {
super.append(str);
return this;
}
请楼主记住:所有的Immutable对象(即:状态不能改变的对象)是线程安全的。因此:除了String的对象外,其它的如:Integer类的对象,BigDecimal类的对象,BigInteger类的对象等都是Immutable对象,都是线程安全的。
这些程序是书本上的,是多线程模式中的Single Thread Execution,不过不是关于String不安全的。
自己看看下面的程序,
public class UserThread extends Thread {
private final Gate gate;
private final String myname;
private final String myaddress;
public UserThread(Gate gate,String myname,String myaddress)
{
this.gate=gate;
this.myname=myname;
this.myaddress=myaddress;
}
public void run()
{
System.out.println(myname+"BEGIN");
while(true)
{
gate.pass(myname,myaddress);
}
}
}安全的线程,不安全的已注释
public class Gate
{
private int counter=0;
private String name="nobody";
private String address="nowhere";
public synchronized void pass(String name,String address)
//public void pass(String name,String address)
{
this.counter++;
this.name=name;
this.address=address;
check();
}
public synchronized String toString()
//public String toString()
{
return "No"+counter+":"+name+","+address;
}
private void check()
{
if(name.charAt(0)!=address.charAt(0))
{
System.out.println("**** BROKEN****"+toString());
}
}
}
测试程序如下:
public class Main {
public static void main(String [] agrs)
{
System.out.println("testing gate,press CTRL+C to stop");
Gate gate=new Gate();
new UserThread(gate,"alice","alssk").start();
new UserThread(gate,"bob","braiz").start();
new UserThread(gate,"cici","china").start();
}}
顶,这个才是正解, immutable对象不存在线程安全问题, 你无法改写其对象, 所以,不会存在读写冲突。
String的对象,本身是线程安全的啊。
11楼说的没错,哈哈。StringBuilder不是线程安全的,而且他和StringBuffer所实现的接口都相同,
所以,可以通过同一个套方法进行类比测试。