什么是JUC
就是jdk為了操作多線程的一個(gè)工具包的簡(jiǎn)稱
image.png
通過代碼對(duì)比Lock和Synchronizied的用法和區(qū)別
Synchronizied
/**
* @author 小魚
* @version 1.0
* @date 2021/3/17 9:37 下午
* 通過oop編程買票
*
* 真正的多線程開發(fā)咱旱,公司中的開發(fā),降低耦合性
* 線程就是一個(gè)單獨(dú)的資源類须喂,沒有任何的附屬操作
* 1.屬性 2.方法
*/
public class SaleTicket01 {
public static void main(String[] args) {
//創(chuàng)建資源類
Ticket ticket = new Ticket();
//總共三個(gè)線程共同操作一個(gè)資源類
new Thread(()->{
for (int i = 0; i < 50; i++) {
ticket.buyTicket();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 50; i++) {
ticket.buyTicket();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 50; i++) {
ticket.buyTicket();
}
},"C").start();
}
}
//資源類:OOP思想沦辙,只需要關(guān)注對(duì)象史侣,不是面向接口編程
class Ticket{
//屬性:50張票
private int num=50;
//方法:同過synchronized實(shí)現(xiàn)同步方法,達(dá)到線程安全。synchronized的本質(zhì)就是:隊(duì)列+鎖
public synchronized void buyTicket(){
if(num>0){
System.out.println(Thread.currentThread().getName()+"已經(jīng)買了第"+(num--)+"張票!還剩下"+num);
}
}
}
Lock
Lock是一個(gè)接口茎匠,最常用的實(shí)現(xiàn)類是ReentrantLock
創(chuàng)建ReentrantLock有兩種方式:非公平鎖和公平鎖
-
非公平鎖
非公平鎖.png
這是默認(rèn)的創(chuàng)建方式忘瓦,非公平鎖:就是不公平的搁廓,不是誰先進(jìn)來誰就先執(zhí)行。
-
公平鎖
公平鎖.png
公平鎖:就是公平的耕皮,是誰先進(jìn)來誰就先執(zhí)行境蜕。
/**
* @author 小魚
* @version 1.0
* @date 2021/3/17 10:00 下午
*
* 通過Lock的方法實(shí)現(xiàn)多線程同步安全買票
*
* Lock三部曲用法:
* 1定義一個(gè)類變量Lock,
* 2在try 代碼塊中通過lock.lock();添加鎖,
* 3在finally代碼塊中解鎖凌停; lock.unlock();
*/
public class SaleTicketByLock02 {
public static void main(String[] args) {
//創(chuàng)建資源類
Ticket2 ticket = new Ticket2();
//總共三個(gè)線程共同操作一個(gè)資源類
new Thread(()->{
for (int i = 0; i < 50; i++) {
ticket.buyTicket();
}
},"A").start();
new Thread(()->{
for (int i = 0; i < 50; i++) {
ticket.buyTicket();
}
},"B").start();
new Thread(()->{
for (int i = 0; i < 50; i++) {
ticket.buyTicket();
}
},"C").start();
}
}
class Ticket2{
//屬性:50張票
private int num=50;
Lock lock =new ReentrantLock();
//方法:通過Lock達(dá)到線程安全粱年。
public void buyTicket(){
//加鎖
lock.lock();
try {
//業(yè)務(wù)代碼
if(num>0){
System.out.println(Thread.currentThread().getName()+"已經(jīng)買了第"+(num--)+"張票!還剩下"+num);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//解鎖
lock.unlock();
}
}
}
Lock和Synchronized區(qū)別總結(jié)
1.Lock是接口,synchronized是Java的關(guān)鍵字
2.Lock適合代碼量大的地方使用罚拟,synchronized使用代碼量小的地方使用
3.Lock:可重入鎖台诗,可以調(diào)整是否是公平鎖還是非公平鎖,可以判斷鎖赐俗。synchronized:可重入鎖拉队,非公平鎖,不可中斷
4.Lock:必須手動(dòng)釋放鎖秃励,不然會(huì)造成死鎖氏仗。synchronized:會(huì)主動(dòng)釋放鎖
5.Lock:可以判斷鎖的狀態(tài),是否獲到了鎖夺鲜。synchronized:不能判斷鎖的狀態(tài)
6.Lock:不會(huì)一直等待下去皆尔,因?yàn)閠ryLock()方法。synchronized:可能因?yàn)榫€程1獲取到了鎖(阻塞)币励,線程2一直等待下去