volatile并不能保证数据同步

    volatile关键字在Java编程中,应用的比较少,主要原因无外乎两点,一是因为Java1.5之前该关键字在不同的系统下的表现没有统一,所带来的问题就是程序的可移植性比较差,其二,就是因为非常难设计,而且误用比较多,所以导致volatile的名誉受损。     我们都知道,每个线程都运行在栈内存之中,每个线程都有自己的工作内存空间,比如说寄存器,高速缓冲储存器等,线程的计算一般是 通过在工作内存进行交互的,我们来看一下图片,来更明确这一点:             从图上,我们很清楚的知道了线程读入变量的时候是从主内存加载到工作内存中的值,线程的写也是在这一个工作内存中,之后在刷新到主内存中,这样就会产生一个问题,就是线程读取的值是不新鲜的值,会出现不同线程所持有的“相同”公共变量不同步的情况。     应对这种情况的办法还是很多的,比如说在更新和读取时使用synchronized的同步代码,或者使用Lock解决该问题,不过,Java可以使用非常简单的方法实现该问题,比如说,这篇文章的主角,volatile,加上该关键字之后,可以确保每一条线程在对改制进行操作的时候是面向主内存中的值,而不是工作内存的值,示意图:         这就是volatile的原理,但是,这是不是就能保证数据的同步性呢?     答案是,当然不能。     以下代码可以尝试运行一下: public class…

Java中实现多继承

    众所周知,Java中是没有多继承的,只有多实现.但是,有时候我们确实需要继承多个类,这是个比较现实的问题,但是,标准的语法限制了我们,虽然可以通过多重继承来达到这样的效果,但是,看上去依旧那么不优雅,所以这边我想到一个办法,即通过内部类的方式进行多继承.     我们就以一个比较浅显的例子来说明问题,人类的造人.我们都知道,子女的很大部分都是由父母继承而来,所以需要多继承,通常情况下,我们通常会这么写:     先是父母类接口: public interface MotherIF { public int getKind(); } public interface FatherIF{ public int getStrong();…