日期:2014-05-20  浏览次数:20704 次

java 线程同步的类和非线程同步的类(api中的类)有什么区别?
就比如StringBulid和StringBuffer一个非同步,一个同步,
但是我用这两个类型的时候感觉不到区别,但是实质上的区别是什么呢,什么时候用哪个?
我就知道线程类内存开销大,但是就是具体应用的区别,我感觉不到,有没有高手举例说明一下呢 ?谢谢了 !

------解决方案--------------------
如果你只用这两个类,并且你的代码很简单的话,同步和非同步你跟本不会感觉到的。但是如果你的代码足够复杂,并且用了不止这两个类的话,就会发现不一样。。。

如果你查看了这两个类的源码后就会发现不一样的,StringBuild的每一个方法前都会有一个关键字synchronized,这也是StringBuild类和StringBuffer类的本质区别,当在一个线程中,StringBuild类的一个方法正在被使用,这个方法源码中前面有synchronized关键字,那么其它的线程就不能同时调用这个类的方法。这个线程只能处于阻塞状态,直到正在调用这个方法的线程结束了,它才能由阻塞继续执行,调用这个方法。而StringBuffer就不会的上述的那种情况,两个线程可以同时用StringBuffer类中的同一个方法。。。这就是同步与非同步的本质区别。当看到这进而你应该知道什么时候用StringBuild,什么时候用StringBuffer了,前者从线程来看要安全得多,要知道,一个数据同时被两个线程操作的话,会出现线程安全问题,因为你不会确定操作之后会是什么结果。如果程序代码足够复杂的话,这是十危险的!


上面是我个人的理解,有什么不对的多多批评指正。。。
------解决方案--------------------
果你要研究线程同步的问题,自己尝试着做个例子是最合适的了。
你尝试做一个银行账户类,成员变量为余额,提供存钱set,取钱get方法。(不要添加synchronized关键字)
然后做两个用户类,一个线程取钱,一个存钱,然后测试类启用两个线程。看效果。
然后加上synchronized再看效果。
你就会发现加上synchronized是符合常理的结果。
说直白一点,加上synchronized之后就是一个线程调用该方法时,其它线程不允许使用该方法。
至于其优势,就应该在例子中慢慢体会了。
------解决方案--------------------
引用:
如果你只用这两个类,并且你的代码很简单的话,同步和非同步你跟本不会感觉到的。但是如果你的代码足够复杂,并且用了不止这两个类的话,就会发现不一样。。。

如果你查看了这两个类的源码后就会发现不一样的,StringBuild的每一个方法前都会有一个关键字synchronized,这也是StringBuild类和StringBuffer类的本质区别,当在一个线程中,Stri……

++
同步的话,当资源竞争的时候,会阻止冲突,这样只能有一个进程使用,其他的需要等待。
所以如果没有这个需求的话,完全没有必要去同步
------解决方案--------------------
引用:
引用:如果你只用这两个类,并且你的代码很简单的话,同步和非同步你跟本不会感觉到的。但是如果你的代码足够复杂,并且用了不止这两个类的话,就会发现不一样。。。

如果你查看了这两个类的源码后就会发现不一样的,StringBuild的每一个方法前都会有一个关键字synchronized,这也是StringBuild类和StringB……
是的。。。有没有必要用同步机制,也不是绝对的,只是在于是不是最优算法。。。
------解决方案--------------------
单线程用Stringbuilder,多线程用后者!
------解决方案--------------------
引用:
引用:引用:如果你只用这两个类,并且你的代码很简单的话,同步和非同步你跟本不会感觉到的。但是如果你的代码足够复杂,并且用了不止这两个类的话,就会发现不一样。。。

如果你查看了这两个类的源码后就会发现不一样的,StringBuild的每一个方法前都会有一个关键字synchronized,这也是……


大兄弟啊  ,你说反了啊  !!~~~