æ»çç»è®ºï¼javaæ¯
线ç¨å®å
¨çï¼å³å¯¹ä»»ä½æ¹æ³ï¼å
æ¬éææ¹æ³ï¼é½å¯ä»¥ä¸èè线ç¨å²çªï¼ä½æä¸ä¸ªåæï¼å°±æ¯ä¸è½åå¨
å
¨å±åéãå¦æåå¨å
¨å±åéï¼åéè¦ä½¿ç¨åæ¥æºå¶ã
å¦ä¸éè¿ä¸ç»å¯¹æ¯ä¾åä»å¤´è®²è§£ï¼
å¨
å¤çº¿ç¨ä¸ä½¿ç¨éææ¹æ³ä¼åçä»ä¹äºï¼ä¹å°±æ¯è¯´å¤çº¿ç¨è®¿é®åä¸ä¸ªç±»çstaticéææ¹æ³ä¼åçä»ä¹äºï¼æ¯å¦ä¼åç线ç¨å®å
¨é®é¢ï¼
public class Test {
public static void operation(){
// ... do something
}
}
äºå®è¯æåªè¦å¨éæå½æ°ä¸æ²¡æå¤çå¤çº¿ç¨å
±äº«æ°æ®ï¼å°±ä¸åå¨çå¤çº¿ç¨è®¿é®åä¸ä¸ªéææ¹æ³ä¼åºç°èµæºå²çªçé®é¢ãä¸é¢çä¸ä¸ªä¾åï¼
public class StaticThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
StaticAction.print();
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(new StaticThread()).start();
}
}
}
public class StaticAction {
public static int i = 0;
public static void print() {
int sum = 0;
for (int i = 0; i < 10; i++) {
System.out.print("step " + i + " is running.");
sum += i;
}
if (sum != 45) {
System.out.println("Thread error!");
System.exit(0);
}
System.out.println("sum is " + sum);
}
}
å®é
æ§è¡çç»ææ¾ç¤ºå个线ç¨å¯¹éææ¹æ³ç访é®æ¯äº¤åæ§è¡çï¼ä½æ¯è¿å¹¶ä¸å½±åå个线ç¨éææ¹æ³print()ä¸sumå¼ç计ç®ãä¹å°±æ¯è¯´ï¼å¨æ¤è¿ç¨ä¸æ²¡æ使ç¨å
¨å±åéçéææ¹æ³å¨å¤çº¿ç¨ä¸æ¯å®å
¨çï¼éææ¹æ³æ¯å¦å¼èµ·çº¿ç¨å®å
¨é®é¢ä¸»è¦ç该éææ¹æ³æ¯å¦å¯¹å
¨å±åéï¼
éæåéstatic memberï¼è¿è¡ä¿®æ¹æä½ã
å¨å¤çº¿ç¨ä¸ä½¿ç¨åä¸ä¸ªéææ¹æ³æ¶ï¼æ¯ä¸ªçº¿ç¨ä½¿ç¨åèªçå®ä¾å段(instance field)çå¯æ¬ï¼èå
±äº«ä¸ä¸ªéæå段(static field)ãæ以说ï¼å¦æ该éææ¹æ³ä¸å»æä½ä¸ä¸ªéææåï¼åªå¨æ¹æ³å
é¨ä½¿ç¨å®ä¾å段(instance field)ï¼ä¸ä¼å¼èµ·å®å
¨æ§é®é¢ã
ä½æ¯ï¼å¦æ该éææ¹æ³æä½äºä¸ä¸ªéæåéï¼åéè¦éææ¹æ³ä¸éç¨äºæ¥è®¿é®çæ¹å¼è¿è¡å®å
¨å¤çãæ们æ¥çä¸ä¸æ²¡æ使ç¨äºæ¥è®¿é®çè¯ä¼äº§çææ ·çé®é¢ï¼public class StaticAction {
public static int i = 0;
public static void incValue() {
int temp = StaticAction.i;
try {
Thread.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
temp++;
StaticAction.i = temp;
}
}
public class StaticThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
StaticAction.incValue();
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(new StaticThread()).start();
}
try {
Thread.sleep(1000); //é¢ç足å¤çæ¶é´è®©ä¸é¢ç线ç¨è·å®
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(StaticAction.i);
}
}
å®é
è¿è¡ç»ææ¾ç¤ºiå¼ä¸ºéæºçæ°åã为äºå®ç°äºæ¥è®¿é®ï¼è¿æ¶æ们éè¦å å
¥ä¸ä¸ªsynchronizedå
³é®åã代ç ä¿®æ¹å¦ä¸ï¼
public class StaticAction {
public static int i = 0;
public synchronized static void incValue() {
int temp = StaticAction.i;
try {
Thread.sleep(1);
} catch (Exception e) {
e.printStackTrace();
}
temp++;
StaticAction.i = temp;
}
}
public class StaticThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
StaticAction.incValue();
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(new StaticThread()).start();
}
try {
Thread.sleep(1000);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(StaticAction.i);
}
}
è¿è¡ç»æåå¿
ç¶æ¯100ã
å å
¥synchronizedå
³é®åçéææ¹æ³ç§°ä¸ºåæ¥éææ¹æ³ã
å¨è®¿é®åæ¥éææ¹æ³æ¶ï¼ä¼è·å该类çâClassâ对象ï¼æ以å½ä¸ä¸ªçº¿ç¨è¿å
¥åæ¥çéææ¹æ³ä¸æ¶ï¼çº¿ç¨çè§å¨è·åç±»æ¬èº«ç对象éï¼å
¶å®çº¿ç¨ä¸è½è¿å
¥è¿ä¸ªç±»çä»»ä½éæåæ¥æ¹æ³ãå®ä¸åå®ä¾æ¹æ³ï¼å 为å¤ä¸ªçº¿ç¨å¯ä»¥åæ¶è®¿é®ä¸åå®ä¾åæ¥å®ä¾æ¹æ³ãè¿ä¸ªå
¶å®å°±æ¯æä½ç³»ç»ä¸çç¨
ä¿¡å·éå®ç°è¿ç¨çäºæ¥ä¸åæ¥é®é¢ï¼å¦ææ¶åå¨åä¸ä¸ªç±»ä¸æå¤ä¸ªéææ¹æ³ä¸å¤çå¤çº¿ç¨å
±äº«æ°æ®çè¯ï¼é£å°±åæç¨ä¿¡å·é解å³ç产è
-æ¶è´¹è
é®é¢ãä¹å°±æ¯è¯´ï¼éææ¹æ³æ¯ä¸ä»½ä¸´çèµæºï¼å¯¹éææ¹æ³ç访é®å±äºè¿å
¥
临çåºï¼å¯¹éæåéçä¿®æ¹æ¯ä¸ä»½ä¸´çèµæºï¼å¯¹éæåéçä¿®æ¹å±äºè¿å
¥ä¸´çåºã