描述 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。简单的说就是,我们在访问实际对象时,是通过代理对象来访问的,代理模式就是在访问实际对象时引入一定程度的间接性,因为这种间接性,可以附加多种用途。 Example // Person.java public interface Person { void eat(String food); } // Main.java public class Man implements Person { private String name; public Man(String name) { this.name = name; } @Override public void eat(String
java
标签: java
[转]Java volatile总结
内存模型的相关概念 计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓存。也就是,当程序在运行过程中,会将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行计算时就可以直接从它的高速缓存读取数据和向其中写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。 举个简单的例子,比如下面的这段代码:i = i + 1;当线程执行这个语句时,会先从主存当中读取i的值,然后复制一份到高速缓存当中,然后CPU执行指令对i进行加1操作,然后将数据写入高速缓存,最后将高速缓存中i最新的值刷新到主存当中。 这个代码在单线程中运行是没有任何问题的,但是在多线程中运行就会有问题了。在多核CPU中,每条线程可能运行于不同的CPU中,因此每个线程运行时有自己的高速缓存(对单核CPU来说,其实也会出现这种问题,只不过是以线程调度的形式来分别执行的)。本文我们以多核CPU为例。比如同时有2个线程执行这段代码,假如初始时i的值为0,那么我们希望两个线程执行完之后i的值变为2。但是事实会是这样吗? 可能存在下面一种情况:初始时,两个线程分别读取i的值存入各自所在的CPU的高速缓存当中,然后线程1进行加1操作,然后把i的最新值1写入到内存。此时线程2的高速缓存当中i的值还是0,
Java创建对象的四种方式
1.通过new新建对象 通常都是使用java的关键字new来创建对象实例。 若有一个A类,则可以通过下面的语句创建A类的对象实例并指定到变量obj。 //定义A类 class A{ } //通过new创建A的对象 A a = new A(); 2.通过clone复制对象 若程序写成如下,则可以根据当前对象(this)建立一个新实例对象(没有调用构造函数). public class A implements Cloneable{ private A obj; public A cloneA() { try { obj = (A)this.clone(); } catch (CloneNotSupportedException e) { e.printStackTrace(); } return obj; } } 如果需要复制上面的那个obj指向的对象实例时,调用somethingNew.cloneSomething()方法就ok了。 但是为什么不直接使用somethingNew.clone()呢?
Java静态变量的初始化(static块的本质)
转自:http://blog.csdn.net/darxin/article/details/5293427 在网上看到了下面的一段代码: public class Test { static { i = 20; } public static int _i = 10; public static void main(String[] args) { System.out.println(i); } } 上述代码会打印出什么结果来呢?10还是20?本文将以此代码为引子,着重讨论一下静态变量的初始化问题。 问题1:静态变量如何初始化 Java类中可以定义一个static块,用于静态变量的初始化。如: public class Test { public static int _i; static { _i = 10;
java为什么不支持多继承?
多继承指一个子类能同时继承于多个父类,从而同时拥有多个父类的特征,但缺点是显著的。 1.若子类继承的父类中拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量。 * * 如: public class classA // 父类 classA{ privateint num = 0;} public class classB // 父类 classB{ private int num= 1;} public class classC extends classA,classB // 子类 classC 继承于 classA 和 classB{ public static void main(String [] args){ classC obj = new classC(); obj.print(); // 调用父类成员变量 num