您的位置:首页 > 产品设计 > UI/UE

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

2014-05-05 16:59 411 查看
http://www.w3c.com.cn/%E6%80%8E%E4%B9%88%E7%90%86%E8%A7%A3stringbuffer%E6%98%AF%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84stringbuilder%E6%98%AF%E7%BA%BF%E7%A8%8B%E4%B8%8D%E5%AE%89%E5%85%A8%E7%9A%84

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

HashMap不是线程安全的 HashTable是线程安全

一直不理解JAVA里的API的类说 哪个类是线程安全的 哪个类不安全 到底啥意思呢

楼主 – u014039623:

23个回复
回复1楼 – rui888:

你看看源码 涉及到 synchronized

回复2楼 – w363403269:

如果你写了一个全局范围的StringBuffer和StringBuilder…两个线程不能同时修改StringBuffer中的内容,而能同时修改StringBuilder中的东西

回复3楼 – u014039623:

引用 2 楼 w363403269 的回复:

如果你写了一个全局范围的StringBuffer和StringBuilder…两个线程不能同时修改StringBuffer中的内容,而能同时修改StringBuilder中的东西

全局变量是指一个项目里的变量还是一个类的变量啊

回复4楼 – w363403269:

如果你只在一个非静态方法中作为局部变量利用一下,完全可以用StringBuilder,它性能好一些

回复5楼 – wlwlwlwl015:

线程安全就是说多线程访问同一代码,不会产生不确定的结果。编写线程安全的代码是低靠线程同步。

你可以查一下线程安全的实现原理。

回复6楼 – u014039623:

引用 1 楼 rui888 的回复:

你看看源码 涉及到 synchronized

恩 是涉及到synchronized 但是不明白什么情况需要用线程安全的类 什么情况下可以用线程不安全的类 因为线程不安全的类效率高 速度快

回复7楼 – longtian1213:

java中的全局变量是指类中声明的静态变量

回复8楼 – u014039623:

引用 4 楼 w363403269 的回复:

如果你只在一个非静态方法中作为局部变量利用一下,完全可以用StringBuilder,它性能好一些

你刚才说的全局变量到底是指一个项目公用的变量 还是指一个类的;里的变量啊 局部变量应该是方法内的变量吧 我没明白你说的全局和局部的范围

回复9楼 – w363403269:

引用 3 楼 u014039623 的回复:
Quote: 引用 2 楼 w363403269 的回复:

如果你写了一个全局范围的StringBuffer和StringBuilder…两个线程不能同时修改StringBuffer中的内容,而能同时修改StringBuilder中的东西

全局变量是指一个项目里的变量还是一个类的变量啊

既可以是一个项目里的变量,例如在ServletContext中;又可能是一个类的变量:如果你把你个类的属性,声明为static型的,那就是个全局变量。

回复10楼 – XiaoZhao821907280:

主要就是异步和同步的区别。你了解了异步和同步 就了解了

回复11楼 – w363403269:

而且,如果你的类实例化为单例模式,类本身就是全局的,那里边的变量也就相当于全局的。

所有与线程安全相关的知识,都涉及到这个全局问题,如果一点全局性的都不用考虑,每次请求都是new和新创建,基本就不用考虑线程安全问题。

回复12楼 – u014039623:

引用 9 楼 w363403269 的回复:
Quote: 引用 3 楼 u014039623 的回复:

Quote: 引用 2 楼 w363403269 的回复:

如果你写了一个全局范围的StringBuffer和StringBuilder…两个线程不能同时修改StringBuffer中的内容,而能同时修改StringBuilder中的东西

全局变量是指一个项目里的变量还是一个类的变量啊

既可以是一个项目里的变量,例如在ServletContext中;又可能是一个类的变量:如果你把你个类的属性,声明为static型的,那就是个全局变量。

恩 这个servletcontext里的变量是所有的servlet都可以访问的 每个servlet定义的便利只有那个servlet可以访问 我很疑惑 我以前看JAVA书 只有成员变量和局部变量的概念 今天第一次听说全局变量 加个static不是静态变量了吗 就是所有这个类new出来的对象说公用的 为啥说是全局变量呢 请指点啊

回复13楼 – w363403269:

你把目光仅仅局限在一个类里边,每个方法都能用到的,也叫类属性的变量叫成员变量;每个方法只能自己用得到的变量叫局部变量。

但是目光扩大点,在一个应用中有N多类;N多请求线程。没个线程都能访问到的叫全局变量,;每个线程结束后就自动销毁,只能自己访问和使用的变量,也叫局部变量,这个局部只是个相对的叫法而已,不能绝对。。。这样说,你能懂我的意思吗?

回复14楼 – u011461314:

引用 2 楼 w363403269 的回复:

如果你写了一个全局范围的StringBuffer和StringBuilder…两个线程不能同时修改StringBuffer中的内容,而能同时修改StringBuilder中的东西

看到这有点感觉了。

能不能举个开2线程的例子看看。

回复15楼 – u014039623:

引用 2 楼 w363403269 的回复:

如果你写了一个全局范围的StringBuffer和StringBuilder…两个线程不能同时修改StringBuffer中的内容,而能同时修改StringBuilder中的东西

你好 你这句话说反了吧 既然StringBuffer线程是安全的 那么应该两个线程能同时修改StringBuffer的内容啊

StringBuilder不安全 所以不能用两个线程同时修改啊

回复16楼 – u014039623:

引用 13 楼 w363403269 的回复:

你把目光仅仅局限在一个类里边,每个方法都能用到的,也叫类属性的变量叫成员变量;每个方法只能自己用得到的变量叫局部变量。

但是目光扩大点,在一个应用中有N多类;N多请求线程。没个线程都能访问到的叫全局变量,;每个线程结束后就自动销毁,只能自己访问和使用的变量,也叫局部变量,这个局部只是个相对的叫法而已,不能绝对。。。这样说,你能懂我的意思吗?

谢谢耐心讲解 有点懂了 对了 StringBuffer是线程安全的 那个StringBuffer应该可以两个线程同时修改StringBuffer的内容吧

回复17楼 – w363403269:

安全:是指对一个请求来说,我开始访问、使用、访问结束,都是合情合理的,都是逻辑正确的;如果在访问和使用中被别人给更改了,那还叫安全吗???

回复18楼 – u011461314:

当然没说错。

a = ”bbb”;

b = a.append(“xx”);

c = a.append(“yy”);

线安 b = bbbxx c=bbbxxyy;

线不安 b= bbbxx c=bbbyy;

回复19楼 – cjb7625:

比如说一个StringBuffer对象,一个线程调用StringBuffer.append(“a”),另一个线程调用StringBuffer.append(“b”),那它的数据肯定包含”a”,和”b”这两个字符。但同样的操作对StringBuilder来说,最终的结果是,数据可能只有”a”,也可能只有”b”或同时有”a“也有”b”,这是不确定的。

回复20楼 – u011461314:

b = a.append(“xx”);

c = a.append(“yy”);



b:线 a.append(“xx”);

c:线 a.append(“yy”);

回复21楼 – cheng_e_1990:

线程安全,主要是指多线程操作同一个数据时,防止脏数据的产生。主要的应用场景是应用缓存,缓存是整个系统公用的数据,在多线程系统中,线程的异步访问和修改会导致数据产生异常。

考虑一个场景,A和B两个线程同时操作缓存中的一条数据,A线程对数据进行自加处理,B线程对数据进行校验,如果校验不过,就清除数据。

非线程安全的情况:当A获取到这条数据,准备修改时,B线程进来了,校验完数据,发现数据不正确,就把数据移除了,这时A线程仍旧认为当前持有的数据还是开始获取的数据,这样再做处理就会报空了。

线程安全的情况:就是当一个线程需要对这个数据进行改写时,会给这个数据上一个同步锁,比如A线程拿到数据后,给数据加上同步锁,这时候B线程进来了,但是这时候数据已经上锁,B线程则需要等待A线程释放锁之后才能对数据进行操作,这样就防止了脏数据的产生。

Java API的Stringbuffer 和 HashTable是在较低版本的JDK中提供的。随着软件项目越来越负责,系统对于性能要求越来越高,然而线程的同步访问对系统性能有很大的影响,所以才会有效率更高的StringBuilder和HashMap的产生。当然在使用这些非线程安全的集合时,线程安全问题就需要开发人员自己控制了。

回复22楼 – wdz567:

多线程,跨域调用!

回复23楼 – u014386926:

简单点说就是在多线程环境下,多个线程对同一个StringBuffer类型的对象(不用管这个对象是否是全局变量,只要是同一个对象)做操作时,会是一个同步的操作,StringBuilder就不会是同步操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: