自己在之前做兩個專案中遇到多執行緒併發訪問如何解決的一個簡單demo程式
阿新 • • 發佈:2019-02-17
package com.geloin.main; public class TestMoreThread { public static void main(String[] args) { final test t0=new test(); final test t1=new test(); Thread th1=new Thread() { public void run() { t0.function("Thread No1..."); }; }; Thread th2=new Thread(){ public void run() { t1.function("Thread No2..."); }; }; th1.start(); th2.start(); } } class test{ public synchronized static void function(String test){ for(int i=0;i<5;i++){ System.out.println("Current Thread Name is:"+Thread.currentThread().getName()+" executed result is :" +test+i); } } }
總結:
1、在多執行緒訪問中,同步化靜態化方法的時候,在類載入的時候就提供了靜態方法的入口地址,屬於類的訪問方法。
2、當多執行緒訪問的時候,如果類中的不同例項共同訪問同步化的靜態方法時,當一個執行緒在執行,其他執行緒就處於等待狀態,直到當前執行緒執行完畢,從中看出不同類的例項共享同一個靜態方法的入口地址,因而不會出現執行緒不安全的問題。
3、如果靜態化普通方法則存線上程不安全的問題,由於類的不同物件在例項化的過程中,每個物件都單獨擁有自身普通方法的入口地址,所以當多執行緒的不同物件訪問的過程中就會出現併發時的資料不一致的問題,但是如果同步的是同一個物件在多執行緒訪問時,同步化普通方法則不會出現執行緒不安全問題。