package com.bjsxt.base.sync001; import java.util.concurrent.atomic.AtomicInteger; /** * 線程安全概念:當多個線程訪問某一個類(對象或方法)時,這個對象始終都能表現出正確的行爲,那麼這個類(對象或方法)就是線程安全的。 * synchronized:能夠在任意對象及方法上加鎖,而加鎖的這段代碼稱爲"互斥區"或"臨界區" * @author alienware * */ public class MyThread extends Thread{ private int count = 5 ; //synchronized加鎖 synchronized public void run(){ count--; System.out.println(this.currentThread().getName() + " count = "+ count); } public static void main(String[] args) { /** * 分析:當多個線程訪問myThread的run方法時,以排隊的方式進行處理(這裏排隊是按照CPU分配的前後順序而定的), * 一個線程想要執行synchronized修飾的方法裏的代碼: * 1 嘗試得到鎖 * 2 若是拿到鎖,執行synchronized代碼體內容;拿不到鎖,這個線程就會不斷的嘗試得到這把鎖,直到拿到爲止, * 並且是多個線程同時去競爭這把鎖。(也就是會有鎖競爭的問題) */ MyThread myThread = new MyThread(); Thread t1 = new Thread(myThread,"t1"); Thread t2 = new Thread(myThread,"t2"); Thread t3 = new Thread(myThread,"t3"); Thread t4 = new Thread(myThread,"t4"); Thread t5 = new Thread(myThread,"t5"); t1.start(); t2.start(); t3.start(); t4.start(); t5.start(); } }
1.1 併發編程的學習的目的java
+ 咱們爲何要去學習併發編程?程序員
+ 第一點,這對面試很是重要,是企業面試程序員的標準,是考察要素:面試
1. 考察我公司技術你是否熟悉50%以上,或咱們公司有特殊的技術需求,正好你熟悉。那麼可能會考慮錄用你編程
2. 細節、態度、人品。(一、2條件知足基本上就會錄用你)安全
3. 知識面、潛力(這是加分項)併發
+ 第二點:對本身的技術提高頗有幫助 分佈式
+ 第三點:若是你學好了併發編程,在之後的分佈式系統中,你均可以找到相似併發、分佈式、並行處理問題的概念學習
+ 咱們該如何學習併發編程?this
synchronized, volatile, ReentrantLock, concurrent等字眼看似高深,其實併發編程沒有咱們想象中的那麼複雜,咱們只須要atom
掌握最基本的概念就能夠很輕鬆地入門,而後從中剖析這些概念的本質,結合實際業務去應用上去,那麼你就會成爲併發編程方面的專家。
1.2 線程安全
+ 線程安全的概念:當多個線程訪問某一個類(對象或方法)時,這個類始終都能表現出
正確的行爲,那麼這個類(對象或方法)就是線程安全的。
+ synchronized: 能夠在任意對象及方法上加鎖,而加鎖的這段代碼稱爲 互斥區 或 臨界區。
示例:【com.bjsxt.thread01】MyThread
示例總結:
當多個線程訪問myThread的run方法時,以排隊的方式進行處理(這裏排隊是按照CPU分配的前後順序而定的),
一個線程想要執行synchronized修飾的方法,首先是嘗試得到鎖,若是拿到鎖,就執行synchronized代碼體的內容;拿不到鎖,這個線程就會不斷地嘗試得到這把鎖,直到難道爲止,並且是多個線程同時去競爭這把鎖。也就是會有鎖競爭的問題。
+ 多個小朋友上一間廁所的比喻