怎么理解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就不会是同步操作。
怎么理解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就不会是同步操作。
相关文章推荐
- 怎么理解StringBuffer线程安全,StringBuilder线程不安全
- 证明StringBuffer线程安全,StringBuilder线程不安全
- 字符拼接StringBuilder速度快,但StringBuilder是线程不安全的。(StringBuffer是线程安全的,给buffer加锁)
- StringBuffer线程安全StringBuilder线程不安全
- 线程安全和线程不安全理解
- Stringbuffer的线程安全是怎么实现的
- 线程安全和线程不安全理解
- 线程安全和线程不安全理解
- 线程安全和线程不安全理解
- 线程安全和线程不安全理解
- Java中线程安全与线程非安全ArrayList,Vector 和 HashMap,Hashtable 和StringBuffer,StringBuilder
- 线程安全和线程不安全理解
- 根据StringBuffer、StringBuilder想起的的线程安全与线程不安全
- 进程与线程的区别,线程安全”怎么理解?(2012.5.6百度实习生笔试)
- 线程安全和线程不安全理解
- [深入理解Java虚拟机]第十三章 线程安全与锁优化-线程安全
- 线程安全和线程不安全理解
- 线程安全和线程不安全理解
- String,StringBuffer与StringBuilder的区别|线程安全与线程不安全
- 线程安全和线程不安全理解