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被完全卸載以前。

相關文章
相關標籤/搜索