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

解决方案 »

  1.   

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

  2.   

    果你要研究线程同步的问题,自己尝试着做个例子是最合适的了。
    你尝试做一个银行账户类,成员变量为余额,提供存钱set,取钱get方法。(不要添加synchronized关键字)
    然后做两个用户类,一个线程取钱,一个存钱,然后测试类启用两个线程。看效果。
    然后加上synchronized再看效果。
    你就会发现加上synchronized是符合常理的结果。
    说直白一点,加上synchronized之后就是一个线程调用该方法时,其它线程不允许使用该方法。
    至于其优势,就应该在例子中慢慢体会了。
      

  3.   

    单线程用Stringbuilder,多线程用后者!