咱們知道,在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被完全卸載以前。