首页 > 编程语言 >java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?

java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?

时间:2023-06-21 18:01:03浏览次数:39  
标签:加锁 java Thread synchronized 解锁 ReentrantLock sync 线程

java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?

答案2023-06-21:

java的:

这个问题,我问了一些人,部分人是回答得有问题的。synchronized这是个关键字,加锁和解锁不是直接用代码实现,所以在代码层面上就杜绝了加锁和解锁不在同一个线程得情况。可以这么说,synchronized是无法实现同一把锁的加锁和解锁在不同线程。

ReentrantLock的加锁和解锁,是在代码层面实现的,所以是可以写出这样的代码,如下:

package com.hikvision;

import java.util.concurrent.locks.ReentrantLock;

public class Application {
    private static ReentrantLock lock = new ReentrantLock();
    public static void main(String[] args) {
        // 线程1加锁
        Thread thread1 = new Thread(() -> {
            lock.lock();
            try {
                System.out.println("Thread 1 lock.");
            } finally {
                lock.unlock();
            }
        });

        // 线程2解锁
        Thread thread2 = new Thread(() -> {
            lock.unlock();
            System.out.println("Thread 2 unlock.");
        });

        thread1.start();
        try {
            Thread.sleep(1000); // 等待1秒,确保线程1先执行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        thread2.start();
        try {
            Thread.sleep(1000); // 等待1秒,确保线程2先执行
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

运行结果如下:

在这里插入图片描述

根据运行结果可以看出,ReentrantLock的加锁和解锁在代码层面上可以实现,但是运行会报异常。说明ReentrantLock不支持同一把锁的加锁和解锁能在不同线程。

综上所述:java中synchronized和ReentrantLock的加锁和解锁不能在不同线程。

go的:

go的sync.Mutex的加锁和解锁能在不同协程吗?如果能,如何实现?

sync.Mutex的加锁和解锁,是在代码层面实现的,所以是可以写出这样的代码,如下:

package main

import (
	"fmt"
	"sync"
	"time"
)

func main() {
	// 加锁和解锁可以不在同一个协程
	var m sync.Mutex
	m.Lock()
	fmt.Println("加锁成功")
	go func() {
		time.Sleep(time.Second * 5)
		m.Unlock()
		fmt.Println("解锁成功")
	}()
	time.Sleep(time.Hour)
}

在这里插入图片描述

根据运行结果可以看出,sync.Mutex的加锁和解锁在代码层面上可以实现,运行也正常。说明sync.Mutex支持同一把锁的加锁和解锁能在不同协程。

综上所述:go中sync.Mutex的加锁和解锁能在不同线程。

总结:

java中synchronized和ReentrantLock都是可重入锁,所以在线程上的加锁和解锁会做限制,加锁和解锁必须在同一线程,并且成对出现。

go的sync.Mutex是不可重入锁,所以在协程上的加锁和解锁没做限制。加锁和解锁可以不在同一协程,但要成对出现。

标签:加锁,java,Thread,synchronized,解锁,ReentrantLock,sync,线程
From: https://www.cnblogs.com/moonfdd/p/17496845.html

相关文章

  • 54基于java的高校图书馆座位预约系统设计与实现
    本章节给大家带来一个基于java的座位预约系统,可以用于图书馆占位系统,图书馆座位预约系统,大学自习室占座系统,自习室座位预约系统,图书馆预约占座系统,自习室预约占座系统,高校图书馆座位预约系统等等;下面以图书馆为例,大家把源码下载下来后,还可以修改图书馆名字改成自习室或者阅览室......
  • Java匿名内部类
    classOuter{publicvoidf(){IAia=newIA(){@Overridepublicvoidsay(){System.out.println("hi~");}};ia.say();System.out.println(ia.getClass().get......
  • Java基础-Day01
    Java基础-Day01JDKJREJVM关系JDK=(Java开发工具包)=Java的开发工具(javac.exe,java.exe,javadoc.exe等)+JRE(Java运行环境)JRE=JVM(Java虚拟机)+Java核心类库JDK的下载、安装下载:官网,gitbub安装:傻瓜式安装:JDK/JRE注意问题:安装软件的路径中不能包含中文、空格为什么要配......
  • 【淘宝API接口系列】获取sku详细信息Java获取源代码演示
    ​ 淘宝商品SKU详细信息API接口是指通过开放平台提供的API接口,可以根据商品ID和SKUID等参数,获取淘宝商品SKU的详细信息,包括SKU的价格、库存、销售属性、skuUrl、sku图片等。其作用是方便开发者通过调用API接口,获取淘宝商品SKU的详细信息,进而实现商品价格比较、商品数据采集、......
  • iOS开发笔记 - Objective-C和JavaScript的混编
    最近看了一个对Github上面编程语言使用统计的排行榜,JavaScript真可以说是一枝独秀,很难想象20年前,这个语言只是浏览器中的装饰性语言,能做的事情也就是一点特效或者检查一下要提交给服务器的表单是否满足要求。今天的JavaScript已经是一个全栈语言,从客户端到服务器无所不在。很多编程......
  • javainteger类-偷偷藏不住的想带大家领悟int 和 Integer 的区别
    其实在Java编程中,int和Integer都是非常常用的数据类型,但它们之间存在一些关键的区别,特别是在面向对象编程中。所以接下来,就让我们一起来探讨下关于int和Integer的区别这个问题吧。1.int和Integer的定义int是Java中的一种基本数据类型,用于表示整数。它是Java语言中最常用的数据类型......
  • 53基于java的资源博客论坛系统设计与实现
    ​>本章节给大家带来一个基于java的资源博客论坛系统设计与实现,可适用于java个人博客系统,个人资源博客管理系统,java博客系统,java论坛系统,类似于交友微博,新浪微博,发表动态,笔记博客,个人笔记系统。项目背景在这个网络充斥生活的时代,我们每天的生活都被网络包围着,有时候我们更多的......
  • java+rest方式写一个邮件发送接口
     1<!--发邮件-->2<dependency>3<groupId>org.springframework.boot</groupId>4<artifactId>spring-boot-starter-mail</artifactId>5</dependency>67<dep......
  • javascript WebUploader 分块上传
    ​ 前言文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有......
  • JAVA之树的详解
    JAVA之树的详解度:每一个结点的子节点数量树高:树的总层数根节点:最顶层的节点左子节点:左下方的节点右子节点:右下方的节点二叉查找树特点每一个节点上最多有两个子节点任意节点左子树上的值都小于当前节点任意节点右子树的值都大于当前节点添加节点规则小的存......