怎么理解StringBuffer线程安全和StringBuild线程不安全

来源:互联网 发布:淘宝dota2饰品店 编辑:程序博客网 时间:2024/05/01 18:32


怎么理解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就不会是同步操作。

原创粉丝点击