「java注解缓存」自定义缓存注解
今天给各位分享java注解缓存的知识,其中也会对自定义缓存注解进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
什么是Java缓存技术Cache
java缓存技术
一、什么是缓存
1、Cache是高速缓冲存储器
一种特殊的存储器子系统,其中复制了频繁使用的数据以利于快速访问
2、凡是位于速度相差较大的两种硬件/软件之间的,用于协调两者数据传输速度差异的结构,均可称之为
Cache
二、缓存的分类
1、基于web应用的系统架构图
2、在系统架构的不同层级之间,为了加快访问速度,都可以存在缓存
操作系统磁盘缓存-减少磁盘机械操作
数据库缓存-减少文件系统I/O
应用程序缓存-减少对数据库的查询
Web服务器缓存-减少应用服务器请求
客户端浏览器缓存-减少对网站的访问。
java hibernate注解@cache指的是设定缓存指的是一级还是二级
CPU缓存CPU缓存大小是重要的指标之一,但也影响对CPU速度的高速缓冲存储器的结构和尺寸是在CPU高速缓冲存储器内非常大,非常高的工作频率,通常用频率和处理器的操作效率远比系统存储器和硬盘驱动器大得多。当实际工作中,CPU经常需要重复相同的数据块被读出,并高速缓存大小增加时,可以大大提高CPU内部读取数据的命中率,而不存储器或硬盘上,然后寻找一种方法来提高系统性能。然而,由于CPU芯片面积和成本的因素要考虑,缓存是非常小的。
的L1高速缓存(高速缓存)是CPU的高速缓冲存储器的第一层被分成数据高速缓存和指令高速缓存。的内置于CPU的性能L1高速缓存大的影响,但由一个静态RAM的高速缓冲存储器构成的更复杂的结构,在CPU的芯片面积的情况下,也不能过大,L1级缓存容量是容量和结构没有可能做太多。 L1缓存一般服务器CPU容量通常为32 256KB。
L2缓存(二级缓存)是二级缓存的CPU,分内部和外部芯片。内部芯片二级缓存主频以相同的速度和运行,而外部二级缓存是只有一半的时钟速度。 L2高速缓存的大小会影响CPU的性能,原则是越大越好,现在家庭用CPU 512KB容量最大,但随着服务器和工作站CPU二级缓存高达256-1MB,有的可达2MB或者3MB。
L3缓存(三级缓存),分为两种,早期的是外置的,现在是内置的。虽然这是它的实际作用,L3缓存的应用可以进一步降低内存延迟,同时提升性能,当大量数据以计算的处理器。减少存储器等待时间和提高的大量数据的计算能力的游戏是非常有帮助的。增加L3高速缓存在服务器场中的性能方面仍然有显著改善。让我们有更大的L3缓存配置将更加有效地利用物理内存,所以它比较慢的磁盘I / O子系统可以处理更多的数据请求。处理器具有更大的L3缓存,以提供更有效的文件系统缓存行为及较短消息和处理器队列长度。
java注解@immutable什么意思
从字面意思来理解就是不会发生变化的类,那么是什么不会发生变化呢,其实就是类的状态,也就是不变类的实例一旦被创建,其状态就不会发生变化,举个例子:如果人是一个class,那么我们中的每一个都是人这个类的具体的instance,如果人这个类只有一个状态就是生身父母,那么它就是一个不变类,因为每一个人在出生的那一刹那,生身父母就已经被设置了值,而且终生都不会发生变化。
不变类有什么好处呢?
1) 不变类是线程安全的,由于不变类的状态在创建以后不再发生变化,所以它可以在线程之间共享,而不需要同步。
2) 不变类的instance可以被reuse
创建类的实例需要耗费CPU的时间,当这个实例不再被引用时,将会被垃圾回收掉,这时候,又需要耗费CPU的时间。对于不变类而言,一个好处就是可以将常用的实例进行缓存,从而减少了对象的创建。举个例子,对于布尔型,最常用的便是true and false。JDK中的Boolean类就是一个不变类,并且对这两个实例进行了缓冲。
public final class Boolean implements java.io.Serializable{
/**
* The codeBoolean/code object corresponding to the primitive
* value codetrue/code.
*/
public static final Boolean TRUE = new Boolean(true);
/**
* The codeBoolean/code object corresponding to the primitive
* value codefalse/code.
*/
public static final Boolean FALSE = new Boolean(false);
// 这个方法不会创建新的对象,而是重用已经创建好的instance
public static Boolean valueOf(boolean b) {
return (b ? TRUE : FALSE);
}
}
3) 不变类的某些方法可以缓存计算的结果
hashCode这个方法来自于Object这个类,这个方法用来返回对象的hashCode,主要用于将对象放置到hashtable中时,来确定这个对象的存储位置。对于一个不变类的实例,它的hashCode也是不变的,所以就可以缓存这个计算的结果,来提高性能,避免不必要的运算,JDK中的String类就是一个例子。
public final class String{
/** Cache the hash code for the string */
private int hash; // Default to 0
public int hashCode() {
int h = hash;
if (h == 0) {
// compute the value
hash = h; // cache the value
}
return h;
}
}
在JDK中, String, the primitive wrapper classes, and BigInteger and BigDecimal都是不变类。
如果一个类是不变类,这个类是不是就不能有改变状态的方法呢?
答案当然是否定的,String是一个不变类,仍然有replace,replaceAll这样的方法,而String仍然是一个不变类,那是因为在这些改变状态的方法中,每次都是新创建一个String对象。
如果大家理解了不变类,那也就不难理解为什么在做String的concatenate时,应当用StringBuffer而不是用+的操作符。
如何正确使用String呢?
1) 不要用new去创建String对象。
如果使用new去创建String,那么每次都会创建一个新对象。
public static void main(String[] args) {
String A1 = "A";
String A2 = "A"; // It won't create a new object
checkInstance(A1, A2); // Result: They are same instances
String B1 = new String("A"); // create a new object
String B2 = new String("A"); // creat a new object
checkInstance(B1, B2); // Result: They are different instances
}
private static void checkInstance(String a1, String a2) {
if (a1 == a2) {
System.out.println("They are same instances");
} else {
System.out.println("They are different instances");
}
}
2) 应当用StringBuffer来做连接操作
因为String是一个不变类,那么在做连接操作时,就会创建临时对象来保存中间的运算结果,而StringBuffer是一个mutable class,这样就不需要创建临时的对象来保存结果,从而提高了性能。
我抄来的自己也学到东西了,以前这个都没接触过的说。
java注解缓存的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于自定义缓存注解、java注解缓存的信息别忘了在本站进行查找喔。
发布于:2022-12-08,除非注明,否则均为
原创文章,转载请注明出处。