❶ java多線程中,如何給靜態變數(如List)加鎖/同步
使用synchronized關鍵字同步方法就可以了。
public class Foo2 {
private int x = 100;
public int getX() {
return x;
}
//同步方法
public synchronized int fix(int y) {
x = x - y;
System.out.println("線程"+Thread.currentThread().getName() + "運行結束,減少「" + y + "」,當前值為:" + x);
return x;
}
}
❷ Java中靜態常量和靜態變數的區別
靜態變數是屬於靜態存儲方式,但是屬於靜態存儲方式的量不一定就是靜態變數,例如外部變數雖屬於靜態存儲方式,但不一定是靜態變數,必須由static加以定義後才能成為靜態外部變數,或稱靜態全局變數。
對於自動變數,它屬於動態存儲方式。但是也可以用static定義它為靜態自動變數,或稱靜態局部變數,從而成為靜態存儲方式。由此看來,一個變數可由static進行再說明,並改變其原有的存儲方式。
而在以Pascal為代表的許多程序語言中,所有局部變數都由系統自動分配存儲空間,而所有全局變數的存儲空間則以靜態分配的方式獲取,因此由於實際上「局部變數」和「全局變數」這兩個術語已足以涵蓋所有的情況,在這些程序語言中通常不使用「靜態變數」這一術語,而直接以「全局變數」代之。
在這些程序語言中,靜態變數就是全局變數,而即使在有明確區分全局和靜態變數的程序語言中,在編譯後的代碼里二者也以相同的方式獲取存儲空間。而今術語「靜態變數」的概念則主要基於C族語言的「static」的定義。
靜態變數也可以用於存儲常數。具體來說,靜態變數可用const,constant或final等關鍵字標識,這時其值就會在編譯時設定,並且無法在運行時改變。編譯器通常將靜態常量與文本一起置於目標文件的文本區域,而非常量初始化數據則置於數據區。
❸ java 靜態變數和靜態常量
這個涉及到JAVA的內存機制,我也是不是很精通,就簡單說一下在下的想法:
Java文件在編譯期被Java編譯器編譯誠.class文件,在伺服器啟動時,伺服器需要用到的.class文件會被Java類型載入器載入進Java虛擬機的內存,在Java虛擬機內存的方法區存儲虛擬機載入的類信息、常量、靜態變數、即時編譯器編譯後的代碼等數據。在方法螞拿悔區中存在一個叫運行時常量池的區域,它主要用於存放編譯器生成的各悶正種字面量和符號引敏基用。
這里值得注意的是方法區只是存儲內存中的虛擬機載入的類信息。
靜態常量在編譯期被初始化和分配內存,也就是說靜態常量在編譯就已經實例化了。而靜態變數在類載入過程中的准備階段分配內存,在初始化階段賦值。
回收時機:類被卸載時,靜態變數被銷毀,並釋放內存空間。static變數的生命周期取決於類的生命周期
這是我個人的理解和分析,歡迎各位指出其中的錯誤。
❹ java 類變數 靜態變數
publicclassDemo
{
privateinta;//實例變數
privatestaticinta;//靜態變數(也叫類變數)
publicvoidfun1(){
//這個是實例方法
}
publicvoidstaticfun2(){
//這個是靜態方法(類方法)
}
}
publicstaticvoidmain(String[]args){
//這里調用實例方法
Demodemo=newDemo();
demo.fun1();
//這里調用靜態方法
Demo.fun2();
}
❺ java中什麼方法可以定義靜態變數
java中什麼方法可以定義靜態變數
靜態變數
可以將靜態變數理解為類變數(與對象無關),而實例變數則屬於一個特定的對象。
靜態變數有兩種情況:
靜態變數是基本數據類型,這種情況下在類的外部不必創建該類的實例就可以直接使用
靜態變數是一個引用。這種情況比較特殊,主要問題是由於靜態變數是一個對象的引用,那麼必須初始化這個對象之後才能將引用指向它。因此如果要把一個引用定義成static的,就必須在定義的時候就對其對象進行初始化。
靜態方法
與類變數不同,方法(靜態方法與實例方法)在內存中只有一份,無論該類有多少個實例,都共用一個方法。
靜態方法與實例方法的不同主要有:
靜態方法可以直接使用,而實例方法必須在類實例化之後通過對象來調用。
在外部調用靜態方法時,可以使用「類名.方法名」或者「對象名.方法名」的形式。實例方法只能使用後面這種方式。
靜態方法只允許訪問靜態成員。而實例方法中可以訪問靜態成員和實例成員。
靜態方法中不能使用this(因為this是與實例相關的)。
❻ java 靜態變數和靜態常量
public class 靜態常量
{
//靜態變數!
private static int sum=88;
//靜態常量!
private static final int con=99;
public static void main(string[] args)
{
system.out.println("變數變化前sum="+sum);
sum--;
system.out.println("變數變化後sum="+sum);
system.out.println("變化前con="+con);
//con++;這個注釋一但取消就會報告錯誤:無法為最終變數con分配值
system.out.println("變化後con="+con);
}
}
❼ java中的 靜態變數
其實靜態變數或者方法還是挺好理解的,不知道你在寫java應用程序時注意到沒有,main()函數前面都要有一句public static void main(){}可見main()函數也是靜態的。在程序中聲明的靜態變數和函數。都是和main()函數是同一級別的,可以直接通過類名調用,或者通過實例化對象,再通過對象調用。
普通的變數和函數就只能通過實例化變數調用了。
❽ java 對象鎖和方法鎖有什麼區別
對象鎖&類鎖
對象鎖
當一個對象中有synchronized
method或synchronized
block的時候調用此對象的同步方法或進入其同步區域時,就必須先獲得對象鎖。如果此對象的對象鎖已被其他調用者佔用,則需要等待此鎖被釋放
同步靜態方法/靜態變數互斥體
由於一個class不論被實例化多少次,其中的靜態方法和靜態變數在內存中都只由一份。所以,一旦一個靜態的方法被申明為synchronized。此類所有的實例化對象在調用此方法,共用同一把鎖,我們稱之為類鎖。一旦一個靜態變數被作為synchronized
block的mutex。進入此同步區域時,都要先獲得此靜態變數的對象鎖
類鎖
由上述同步靜態方法引申出一個概念,那就是類鎖。其實系統中並不存在什麼類鎖。當一個同步靜態方法被調用時,系統獲取的其實就是代表該類的類對象的對象鎖
在程序中獲取類鎖
可以嘗試用以下方式獲取類鎖
synchronized
(xxx.class)
{...}
synchronized
(Class.forName("xxx"))
{...}
同時獲取2類鎖
同時獲取類鎖和對象鎖是允許的,並不會產生任何問題,但使用類鎖時一定要注意,一旦產生類鎖的嵌套獲取的話,就會產生死鎖,因為每個class在內存中都只能生成一個Class實例對象。