backup 悲观锁和乐观锁使用场景 阿里java代码规范IDEA插件

咱们知道,在Java中设置变量值的操做,除了long和double类型的变量外都是原子操做,也就是说,对于变量值的简单读写操做没有必要进行同步。
这在JVM 1.2以前,Java的内存模型实现老是从主存读取变量,是不须要进行特别的注意的。而随着JVM的成熟和优化,如今在多线程环境下volatile关键字的使用变得很是重要。
在当前的Java内存模型下,线程能够把变量保存在本地内存(好比机器的寄存器)中,而不是直接在主存中进行读写。
这就可能形成一个线程在主存中修改了一个变量的值,而另一个线程还继续使用它在寄存器中的变量值的拷贝,形成数据的不一致。
要解决这个问题,只须要像在本程序中的这样,把该变量声明为volatile(不稳定的)便可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。
通常说来,多任务环境下各任务间共享的标志都应该加volatile修饰。 Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。并且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。
这样在任什么时候刻,两个不一样的线程老是看到某个成员变量的同一个值。 Java语言规范中指出:为了得到最佳速度,容许线程保存共享成员变量的私有拷贝,并且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 这样当多个线程同时与某个对象交互时,就必需要注意到要让线程及时的获得共享成员变量的变化。 而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。 使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,没必要使用。 因为使用volatile屏蔽掉了VM中必要的代码优化,因此在效率上比较低,所以必定在必要时才使用此关键字。

 

Java对象的大小

Java对象的大小

  基本数据的类型的大小是固定的,这里就很少说了。对于非基本类型的Java对象,其大小就值得商榷。在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:php

Object ob = new Object();

  这样在程序中完成了一个Java对象的生命,可是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所须要的空间。而那8byte则是Java堆中对象的信息。由于全部的Java非基本类型的对象都须要默认继承Object对象,所以不论什么样的Java对象,其大小都必须是大于8byte。html

  有了Object对象的大小,咱们就能够计算其余对象的大小了。java

Class NewObject {
    int count;
    boolean flag;
    Object ob;
}

  其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。可是由于Java在对对象内存分配时都是以8的整数倍来分,所以大于17byte的最接近8的整数倍的是24,所以此对象的大小为24byte。mysql

  这里须要注意一下基本类型的包装类型的大小。由于这种包装类型已经成为对象了,所以须要把他们做为对象来看待。包装类型的大小至少是12byte(声明一个空Object至少须要的空间),并且12byte没有包含任何有效信息,同时,由于Java对象大小是8的整数倍,所以一个基本类型包装类的大小至少是16byte。这个内存占用是很恐怖的,它是使用基本类型的N倍(N>2),有些类型的内存占用更是夸张(随便想下就知道了)。所以,可能的话应尽可能少使用包装类。在JDK5.0之后,由于加入了自动类型装换,所以,Java虚拟机会在存储方面进行相应的优化。android

 

引用类型

  对象引用类型分为强引用、软引用、弱引用和虚引用。sql

  强引用:就是咱们通常声明对象是时虚拟机生成的引用,强引用环境下,垃圾回收时须要严格判断当前对象是否被强引用,若是被强引用,则不会被垃圾回收。数据库

  软引用:软引用通常被作为缓存来使用。与强引用的区别是,软引用在垃圾回收时,虚拟机会根据当前系统的剩余内存来决定是否对软引用进行回收。若是剩余内存比较紧张,则虚拟机会回收软引用所引用的空间;若是剩余内存相对富裕,则不会进行回收。换句话说,虚拟机在发生OutOfMemory时,确定是没有软引用存在的。apache

  弱引用:弱引用与软引用相似,都是做为缓存来使用。但与软引用不一样,弱引用在进行垃圾回收时,是必定会被回收掉的,所以其生命周期只存在于一个垃圾回收周期内数组

  强引用不用说,咱们系统通常在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。他们通常被做为缓存使用,并且通常是在内存大小比较受限的状况下作为缓存。由于若是内存足够大的话,能够直接使用强引用做为缓存便可,同时可控性更高。于是,他们常见的是被使用在桌面应用系统的缓存。缓存

 

java中经常使用的内存区域

在java中主要存在4块内存空间,这些内存的名称及做用以下:

  1. 栈内存空间:保存全部的对象名称(更准确地说是保存了引用的堆内存空间的地址)
  2. 堆内存空间:保存每一个对象的具体属性内容。
  3. 全局数据区:保存static类型的属性。
  4. 全局代码区:保存全部的方法定义。

悲观锁和乐观锁使用场景

乐观锁是在应用层加锁,而悲观锁是在数据库层加锁(for update)

乐观锁顾名思义就是在操做时很乐观,这数据只有我在用,我先尽管用,最后发现不行时就回滚。

悲观锁在操做时很悲观,生怕数据被其余人更新掉,我就先将其先锁住,让别人用不了,我操做完成后再释放掉。

悲观锁须要数据库级别上的的实现,程序中是作不到的,若是在长事务环境中,数据会一直被锁住,致使并发性能大大地下降。

通常来讲若是并发量很高的话,建议使用悲观锁,不然的话就使用乐观锁。

若是并发量很高时使用乐观锁的话,会致使不少的并发事务回滚、操做失败。

总之,冲突概率大用悲观,小就用乐观。

 

mysql "ON DUPLICATE KEY UPDATE" 语法

若是在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,而且插入行后会致使在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;若是不会致使惟一值列重复的问题,则插入新行。 
例如,若是列 a 为 主键 或 拥有UNIQUE索引,而且包含值1,则如下两个语句具备相同的效果:

1 INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;
2 UPDATE TABLE SET c=c+1 WHERE a=1;

若是行做为新记录被插入,则受影响行的值显示1;若是原有的记录被更新,则受影响行的值显示2。 
这个语法还能够这样用: 
若是INSERT多行记录(假设 a 为主键或 a 是一个 UNIQUE索引列): 

1 INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=c+1;

执行后, c 的值会变为 4 (第二条与第一条重复, c 在原值上+1). 

1 INSERT INTO TABLE (a,c) VALUES (1,3),(1,7) ON DUPLICATE KEY UPDATE c=VALUES(c);

执行后, c 的值会变为 7 (第二条与第一条重复, c 在直接取重复的值7). 
注意:ON DUPLICATE KEY UPDATE只是MySQL的特有语法,并非SQL标准语法! 
这个语法和适合用在须要 判断记录是否存在,不存在则插入存在则更新的场景. 

 

mysql int tinyint

tinyint(1)  和 tinyint(3) 没什么区别,占用字节都是一位,存储范围都是同样的

tinyint(3) zerofill ,当插入的数据少于3位的时候,左边自动补零,这才是限制显示长度

int(1) 和 tinyint(1) ,够用的状况下,优先选择tinyint(1),由于占字节少、节省空间。

tinyint一个字节   smallint  两个字节   MEDIUMINT三个字节  int 4个字节  BIGINT 8个字节。

 

可是,varchar(5)  这里的5 限制的是储存字符的个数,字符不分贵贱(不分 中文、英文、数字...)。

 

查看端口占用和干掉进程

netstat -aon|findstr "49157"

taskkill -F -PID 2448

Idea激活

1. 到网站 http://idea.lanyus.com/ 获取注册码。

2.填入下面的license server:

  http://intellij.mandroid.cn/
  http://idea.imsxm.com/
  http://idea.iteblog.com/key.php

 

Maven 国内私服

 1 <mirrors>
 2       <mirror>
 3       <id>alimaven</id>
 4       <name>aliyun maven</name>
 5       <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
 6       <mirrorOf>central</mirrorOf>        
 7     </mirror>
 8     
 9     <mirror>
10       <id>OSChina</id>
11       <name>OSChina Centraln</name>
12       <url>http://maven.oschina.net/content/groups/public/</url>
13       <mirrorOf>central</mirrorOf>        
14     </mirror>
15          <mirror>    
16       <id>net-cn</id>    
17       <mirrorOf>central</mirrorOf>    
18       <name>Human Readable Name for this Mirror.</name>    
19       <url>http://maven.net.cn/content/groups/public/</url>     
20     </mirror>
21     
22     <mirror>    
23       <id>ui</id>    
24       <mirrorOf>central</mirrorOf>    
25       <name>Human Readable Name for this Mirror.</name>    
26       <url>http://uk.maven.org/maven2/</url>    
27     </mirror>    
28 
29     <mirror>    
30       <id>ibiblio</id>    
31       <mirrorOf>central</mirrorOf>    
32       <name>Human Readable Name for this Mirror.</name>    
33       <url>http://mirrors.ibiblio.org/pub/mirrors/maven2/</url>    
34     </mirror>    
35 
36     <mirror>    
37       <id>jboss-public-repository-group</id>    
38       <mirrorOf>central</mirrorOf>    
39       <name>JBoss Public Repository Group</name>    
40       <url>http://repository.jboss.org/nexus/content/groups/public</url>    
41     </mirror>  
42     
43     <mirror>   
44       <id>central</id>  
45       <mirrorOf>central</mirrorOf>              
46       <name>Central Repository</name>  
47       <url>http://central.maven.org/maven2</url>  
48     </mirror>  
49     
50     <mirror>   
51       <id>optional</id>  
52       <mirrorOf>optional</mirrorOf>             
53       <name>Central Repository</name>  
54       <url>https://repo.maven.apache.org/maven2</url>  
55     </mirror>        
56   </mirrors>

 

http://www.cnblogs.com/skywang12345/p/java_threads_category.html

 

阿里java代码规范IDEA插件

File >> Settings >> Plugins >> Browse repositories… 搜 alibaba 便可。

二、点击  安装(Install) 而后按提示重启 IDEA

三、检查安装是否成功:  Tools >> 阿里编码规约

 

@DependsOn和@Lazy

2013年10月14日 ⁄ 综合 ⁄ 共 357字 ⁄ 字号    ⁄ 评论关闭

@DependsOn用于强制初始化其余Bean。能够修饰Bean类或方法,使用该Annotation时能够指定一个字符串数组做为参数,每一个数组元素对应于一个强制初始化的Bean。

@DependsOn({"steelAxe","abc"})
@Component
public class Chinese implements Person{
   //codes here
}

@Lazy用于指定该Bean是否取消预初始化。主要用于修饰Spring Bean类,用于指定该Bean的预初始化行为,使用该Annotation时能够指定一个boolean型的value属性,该属性决定是否要预初始化该Bean。

@Lazy(true)
@Component
public class Chinese implements Person{
   //codes here
}


@PostConstruc @PreConstruct

1.@PostConstruct说明

     被@PostConstruct修饰的方法会在服务器加载Servlet的时候运行,而且只会被服务器调用一次,相似于Serclet的inti()方法。被@PostConstruct修饰的方法会在构造函数以后,init()方法以前运行。

2.@PreConstruct说明

     被@PreConstruct修饰的方法会在服务器卸载Servlet的时候运行,而且只会被服务器调用一次,相似于Servlet的destroy()方法。被@PreConstruct修饰的方法会在destroy()方法以后运行,在Servlet被完全卸载以前。

相关文章
相关标签/搜索