网游活动专题站 - 新版本福利与赛事播报

  • 首页
  • 热门推荐
  • 版本速递
  • 赛事专区

最新发表

  • 索尼手机为什么这么贵
  • 2025年主公走一步春季挑战赛:智谋与策略的巅峰对决
  • 上古神魔:时空裂缝降临——2025年5月26日盛大开启!
  • 《荒野国度》2025盛夏狂欢庆典:全球玩家集结开启荒野求生挑战赛
  • 蜀汉名将魏延有没有谋反?到底是谁要杀他?
  • 3、梦幻西游手游金兰花怎么获得?
  • 万什么一什么的成语
  • 《好声音》录制及播出时间曝光,4位导师已确定,李荣浩成元老导师
  • 神字全部的写法
  • 瑞士军刀背包 在线获取

友情链接

Copyright © 2022 网游活动专题站 - 新版本福利与赛事播报 All Rights Reserved.

JUC(11)各种锁的理解(公平锁、可重入锁、自旋锁、死锁)

赛事专区 · 2026-06-22 21:02:17

文章目录

1、公平锁、非公平锁

2、可重入锁

3、自旋锁

4、死锁

1、公平锁、非公平锁

公平锁:非常公平、不能插队、必须先来后到

非公平锁:非常不公平、可以插队、(默认非公平)可以修改为公平锁

2、可重入锁

拿到外边的锁、就会自动拿到里边的锁。

package com.lock;

/**

* synchronized

*/

public class Demo1 {

public static void main(String[] args) {

Phone phone = new Phone();

new Thread(()->{

phone.sms();

},"A").start();

new Thread(()->{

phone.sms();

},"B").start();

}

}

class Phone{

public synchronized void sms(){

System.out.println(Thread.currentThread().getName()+"sms");

call();

}

public synchronized void call(){

System.out.println(Thread.currentThread().getName()+"call");

}

}

使用lock锁

package com.lock;

import java.util.concurrent.locks.Lock;

import java.util.concurrent.locks.ReentrantLock;

/**

* synchronized

*/

public class Demo1 {

public static void main(String[] args) {

Phone phone = new Phone();

new Thread(()->{

phone.sms();

},"A").start();

new Thread(()->{

phone.sms();

},"B").start();

}

}

class Phone{

Lock lock = new ReentrantLock();

public void sms(){

lock.lock();

try {

System.out.println(Thread.currentThread().getName()+"sms");

call();

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

public void call(){

lock.lock();

try {

System.out.println(Thread.currentThread().getName()+"call");

} catch (Exception e) {

e.printStackTrace();

} finally {

lock.unlock();

}

}

}

3、自旋锁

spinlock自己写自旋锁

package com.lock;

import java.util.concurrent.atomic.AtomicReference;

import java.util.concurrent.atomic.AtomicStampedReference;

public class SpinLockDemo {

AtomicReference atomicReference = new AtomicReference<>();

//加锁

public void mylock(){

Thread thread = Thread.currentThread();

System.out.println(Thread.currentThread().getName()+"mylock");

while (!atomicReference.compareAndSet(null,thread)){

}

}

//解锁

public void myunlock(){

Thread thread = Thread.currentThread();

System.out.println(Thread.currentThread().getName()+"myunlock");

atomicReference.compareAndSet(thread,null);

}

}

package com.lock;

import java.util.concurrent.TimeUnit;

public class Test {

public static void main(String[] args) {

SpinLockDemo spinLockDemo = new SpinLockDemo();

new Thread(()->{

spinLockDemo.mylock();

try {

TimeUnit.SECONDS.sleep(3);

} catch (Exception e) {

e.printStackTrace();

} finally {

spinLockDemo.myunlock();

}

},"A").start();

new Thread(()->{

spinLockDemo.mylock();

try {

System.out.println();

} catch (Exception e) {

e.printStackTrace();

} finally {

spinLockDemo.myunlock();

}

},"B").start();

}

}

4、死锁

package com.lock;

import java.util.concurrent.TimeUnit;

public class DeadLockDemo {

public static void main(String[] args) {

String lockA="lockA";

String lockB ="lockB";

new Thread(new MyThread(lockA,lockB),"T1").start();

new Thread(new MyThread(lockB,lockA),"T2").start();

}

}

class MyThread implements Runnable{

private String lockA;

private String lockB;

public MyThread(String lockA,String lockB){

this.lockA = lockA;

this.lockB =lockB;

}

@Override

public void run() {

synchronized (lockA){

System.out.println(Thread.currentThread().getName()+"lock:"+lockA+"==>"+lockB);

try {

TimeUnit.SECONDS.sleep(2);

} catch (InterruptedException e) {

e.printStackTrace();

}

synchronized (lockB){

System.out.println(Thread.currentThread().getName()+"lock:"+lockB+"==>"+lockA);

}

}

}

}

测试1、使用jps定位进程号jps -l

2、使用jstack 进程号


嫌贵也要继续用 英伟达RTX 50系显卡仍由台积电代工:2个优势无解
教你如何捕捉画眉鸟?