咱们知道,在Java中设置变量值的操做,除了long和double类型的变量外都是原子操做,也就是说,对于变量值的简单读写操做没有必要进行同步。
这在JVM 1.2以前,Java的内存模型实现老是从主存读取变量,是不须要进行特别的注意的。而随着JVM的成熟和优化,如今在多线程环境下volatile关键字的使用变得很是重要。
在当前的Java内存模型下,线程能够把变量保存在本地内存(好比机器的寄存器)中,而不是直接在主存中进行读写。
这就可能形成一个线程在主存中修改了一个变量的值,而另一个线程还继续使用它在寄存器中的变量值的拷贝,形成数据的不一致。
要解决这个问题,只须要像在本程序中的这样,把该变量声明为volatile(不稳定的)便可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。
通常说来,多任务环境下各任务间共享的标志都应该加volatile修饰。
Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。并且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。
这样在任什么时候刻,两个不一样的线程老是看到某个成员变量的同一个值。
Java语言规范中指出:为了得到最佳速度,容许线程保存共享成员变量的私有拷贝,并且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
这样当多个线程同时与某个对象交互时,就必需要注意到要让线程及时的获得共享成员变量的变化。
而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,没必要使用。
因为使用volatile屏蔽掉了VM中必要的代码优化,因此在效率上比较低,所以必定在必要时才使用此关键字。
基本数据的类型的大小是固定的,这里就很少说了。对于非基本类型的Java对象,其大小就值得商榷。在Java中,一个空Object对象的大小是8byte,这个大小只是保存堆中一个没有任何属性的对象的大小。看下面语句:php
Object ob = new Object();
这样在程序中完成了一个Java对象的生命,可是它所占的空间为:4byte+8byte。4byte是上面部分所说的Java栈中保存引用的所须要的空间。而那8byte则是Java堆中对象的信息。由于全部的Java非基本类型的对象都须要默认继承Object对象,所以不论什么样的Java对象,其大小都必须是大于8byte。html
Class NewObject {
int count;
boolean flag;
Object ob;
}
其大小为:空对象大小(8byte)+int大小(4byte)+Boolean大小(1byte)+空Object引用的大小(4byte)=17byte。可是由于Java在对对象内存分配时都是以8的整数倍来分,所以大于17byte的最接近8的整数倍的是24,所以此对象的大小为24byte。mysql
强引用不用说,咱们系统通常在使用时都是用的强引用。而“软引用”和“弱引用”比较少见。他们通常被做为缓存使用,并且通常是在内存大小比较受限的状况下作为缓存。由于若是内存足够大的话,能够直接使用强引用做为缓存便可,同时可控性更高。于是,他们常见的是被使用在桌面应用系统的缓存。缓存
乐观锁是在应用层加锁,而悲观锁是在数据库层加锁(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
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被完全卸载以前。