多线程与高并发(一):单机高并发应该掌握的线程基础:线程状态,异常与锁等
生活随笔
收集整理的這篇文章主要介紹了
多线程与高并发(一):单机高并发应该掌握的线程基础:线程状态,异常与锁等
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
多線程復(fù)習(xí)
多線程的基本概念
什么是一個(gè)線程?如何開(kāi)啟一個(gè)線程?
面試題:請(qǐng)你告訴我啟動(dòng)線程的三種方式
- 繼承Thread,重寫(xiě)run方法
- 實(shí)現(xiàn)Runnable接口,重寫(xiě)run方法(或Lambda表達(dá)式)
- 通過(guò)線程池來(lái)啟動(dòng)(實(shí)際上也是以上兩種之一)
Sleep Yield Join 的含義
- sleep:睡眠,當(dāng)前線程暫停一段時(shí)間,讓給別的線程去執(zhí)行。睡眠時(shí)間到,自動(dòng)復(fù)活
- yield:當(dāng)前線程正在執(zhí)行的時(shí)候,停下來(lái)進(jìn)入等待隊(duì)列,回到等待隊(duì)列里。系統(tǒng)調(diào)度算法去決定哪個(gè)線程繼續(xù)運(yùn)行(有可能還是自己)
- join:在自己當(dāng)前線程加入你調(diào)用的join線程,本線程等待等調(diào)用的線程運(yùn)行完了,自己再去執(zhí)行。(自己join自己沒(méi)有意義)
線程狀態(tài)
如何關(guān)閉線程?
不要使用stop()關(guān)閉線程,要讓線程自己去結(jié)束。
Interrupt 的含義
當(dāng) catch 到 InterruptedException 時(shí),應(yīng)該在邏輯中寫(xiě)好處理方式:讓線程停止或者繼續(xù)運(yùn)行
Syncronized 復(fù)習(xí)
給一個(gè)變量/一段代碼加鎖的含義是:線程拿到鎖之后,才能修改一個(gè)變量/執(zhí)行一段代碼
測(cè)試將syncronized方法和非syncronized方法一起調(diào)用:非syncronized方法并沒(méi)有被阻塞
/*** 同步和非同步方法是否可以同時(shí)調(diào)用?* @author mashibing*/package com.mashibing.juc.c_007;public class T {public synchronized void m1() { System.out.println(Thread.currentThread().getName() + " m1 start...");try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " m1 end");}public void m2() {try {Thread.sleep(5000);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + " m2 ");}public static void main(String[] args) {T t = new T();/*new Thread(()->t.m1(), "t1").start();new Thread(()->t.m2(), "t2").start();*/new Thread(t::m1, "t1").start();new Thread(t::m2, "t2").start();/*//1.8之前的寫(xiě)法new Thread(new Runnable() {@Overridepublic void run() {t.m1();}});*/ } }示例:臟讀
/*** 面試題:模擬銀行賬戶* 對(duì)業(yè)務(wù)寫(xiě)方法加鎖* 對(duì)業(yè)務(wù)讀方法不加鎖* 這樣行不行?** 容易產(chǎn)生臟讀問(wèn)題(dirtyRead)*/package com.mashibing.juc.c_008;import java.util.concurrent.TimeUnit;public class Account {String name;double balance;public synchronized void set(String name, double balance) {this.name = name;try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}this.balance = balance;}public /*synchronized*/ double getBalance(String name) {return this.balance;}public static void main(String[] args) {Account a = new Account();new Thread(()->a.set("zhangsan", 100.0)).start();try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(a.getBalance("zhangsan"));try {TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(a.getBalance("zhangsan"));} }總結(jié)
以上是生活随笔為你收集整理的多线程与高并发(一):单机高并发应该掌握的线程基础:线程状态,异常与锁等的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 四面阿里,看看你都会吗
- 下一篇: 网络与IO知识扫盲(七):仿照Netty