程序笔记   发布时间:2022-07-12  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了java线程锁大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
java线程锁是重入锁:一个线程可以重复获取锁

 

package com.example.demo.config;

public class Thread1 extends Thread{
    public void run() {
        System.out.println("Thread-1: try get lock A...");
        synchronized (Demo.lockA) { //给A加锁
            System.out.println("Thread-1: lock A got.");
            Demo.sleep1s();
            System.out.println("Thread-1: try get lock B...");
            synchronized (Demo.lockB) {//获取B锁
                System.out.println("Thread-1: lock B got.");
                Demo.sleep1s();
            }
            System.out.println("Thread-1: lock B released.");
        }
        System.out.println("Thread-1: lock A released.");
    }
}

 

package com.example.demo.config;

public class Thread2 extends Thread{
    public void run() {
        System.out.println("Thread-2: try get lock B...");
        synchronized (Demo.lockB) {//给B加锁
            System.out.println("Thread-2: lock B got.");
            Demo.sleep1s();
            System.out.println("Thread-2: try get lock A...");
            synchronized (Demo.lockA) {//获取A锁
                System.out.println("Thread-2: lock A got.");
                Demo.sleep1s();
            }
            System.out.println("Thread-2: lock A released.");
        }
        System.out.println("Thread-2: lock B released.");
    }
}

 

package com.example.demo.config;


public class Demo {
    static final Object lockA = new Object();
    static final Object lockB = new Object();
    private Integer value=0;
    private Integer another=0;

    public Integer getValue() {
        return value;
    }

    public void setValue(Integer value) {
        this.value = value;
    }

    public Integer getAnother() {
        return another;
    }

    public void setAnother(Integer another) {
        this.another = another;
    }

    public void add(int m) {
        synchronized (lockA) { // 获得lockA的锁
            System.out.println("获得lockA的锁0");
            this.value += m;
            synchronized (lockB) { // 获得lockB的锁
                System.out.println("获得lockB的锁0");
                this.another += m;
            } // 释放lockB的锁
        } // 释放lockA的锁
    }

    public void dec(int m) {
        synchronized (lockB) { // 获得lockB的锁
            System.out.println("获得lockB的锁1");
            this.another -= m;
            synchronized (lockA) { // 获得lockA的锁
                System.out.println("获得lockA的锁1");

                this.value -= m;
            } // 释放lockA的锁
        } // 释放lockB的锁
    }

    static void sleep1s() {
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) {
                 new  Thread1().start();
                 new  Thread2().start();

        Demo demo=new Demo();
        try {
            demo.add(2);
            demo.dec(2);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


}

 

结果:
Connected to the target VM, address: '127.0.0.1:51315', transport: 'socket'
Thread-1: try get lock A...
Thread-2: try get lock B...
Thread-2: lock B got.
Thread-1: lock A got.
Thread-1: try get lock B...
Thread-2: try get lock A...
造成死锁,线程1 A加锁后获取B线程2 B加锁后获取A造成线程1获取B锁进入等待线程2获取A锁进入等待,死循环下取思维没有好的解决办法,只有停止虚拟机进行解决

 

大佬总结

以上是大佬教程为你收集整理的java线程锁全部内容,希望文章能够帮你解决java线程锁所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: