Java 中的原子性和同步鎖是非常重要的概念,下面我們來(lái)具體了解一下:
1. 原子性
原子性是指一個(gè)操作是不可中斷的,即使在多線程的情況下,一個(gè)操作具有原子性,也不會(huì)被其它線程打斷。例如,對(duì)于普通的變量 i,它的 ++ 操作不具有原子性,因?yàn)檫@個(gè)操作分為兩步:先將 i 取出,然后加上1。如果同時(shí)有兩個(gè)線程對(duì) i 進(jìn)行 ++ 操作,就會(huì)出現(xiàn)沖突。
2. 同步鎖
同步鎖是用來(lái)保證代碼塊在多線程環(huán)境中的同步執(zhí)行的,即在同一時(shí)刻只能有一個(gè)線程進(jìn)入代碼塊。synchronized 就是 Java 中實(shí)現(xiàn)同步鎖的關(guān)鍵字,它可以用來(lái)修飾一個(gè)代碼塊或一個(gè)方法。
下面我們來(lái)看一個(gè)例子:
public class MyThread { private static int num = 0; public static void main(String[] args) { Thread t1 = new Thread(() ->{ for (int i = 0; i< 10000; i++) { addNum(); } }); Thread t2 = new Thread(() ->{ for (int i = 0; i< 10000; i++) { addNum(); } }); t1.start(); t2.start(); try { t1.join(); t2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(num); } private synchronized static void addNum() { num++; } }
這個(gè)例子中,我們創(chuàng)建了兩個(gè)線程 t1 和 t2,將一個(gè)靜態(tài)變量 num 作為共享變量傳遞給它們。然后我們?cè)谶@兩個(gè)線程中都執(zhí)行了 addNum() 函數(shù),這個(gè)函數(shù)使用了 synchronized 關(guān)鍵字修飾,因此保證了在同一時(shí)刻只能有一個(gè)線程執(zhí)行它。最后輸出 num 變量的值,我們會(huì)發(fā)現(xiàn)它的值一定是 20000,這就是同步鎖的作用。
上一篇java cs和bs