java中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?
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中synchronized和ReentrantLock的加锁和解锁能在不同线程吗?如果能,如何实现?的更多相关文章
- Java 中 synchronized的用法详解(四种用法)
Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码.本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧 ...
- java中synchronized与Lock的异同
本文转载自java中synchronized与Lock的异同 前言 synchronized和Lock通过互斥保障原子性,能够保护共享数据以实现线程安全,其作用包括保障原子性.可见性.有序性 常见问题 ...
- java中synchronized的用法详解
记下来,很重要. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码. 一.当两个并发线程访问同一个对象object中的这个synchron ...
- java中synchronized的使用方法与具体解释
Java语言的keyword.当它用来修饰一个方法或者一个代码块的时候,可以保证在同一时刻最多仅仅有一个线程运行该段代码. 一.当两个并发线程訪问同一个对象object中的这个synchronized ...
- 浅析Java中synchronized与static synchronized
synchronized关键字 synchronized是进行同步处理而保证线程安全.在一个方法中,如果是方法内的私有变量,那个这个变量是线程安全的,但是类中的实例变量是可能会出现线程安全问题的,当多 ...
- java中synchronized关键字分析
今天我们来分析一下java中synchronized关键字.首先来看一段java代码:(本地编译环境为mac,jdk1.8的环境) Demo.java package com.example.spri ...
- java中 synchronized 的使用,确保异步执行某一段代码。
最近看了个有关访问网络url和下载的例子,里面有几个synchronized的地方,系统学习下,以下内容很重要,记下来. Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一 ...
- JAVA 中 synchronized 详解
看到一篇关于JAVA中synchronized的用法的详解,觉得不错遂转载之..... 原文地址: http://www.cnblogs.com/GnagWang/archive/2011/02/27 ...
- Java中synchronized 修饰在static方法和非static方法的区别
[问题描述]关于Java中synchronized 用在实例方法和对象方法上面的区别 [问题分析]大家都知道,在Java中,synchronized 是用来表示同步的,我们可以synchronized ...
- JAVA中synchronized和lock详解
目前在Java中存在两种锁机制:synchronized和Lock,Lock接口及其实现类是JDK5增加的内容,其作者是大名鼎鼎的并发专家Doug Lea.本文并不比较synchronize ...
随机推荐
- 使用ensp搭建路由拓扑,并使用isis协议实现网络互通实操
转载请注明出处: 1.通过拓扑搭建如下拓扑: 其中R7.R8为L1,R6为L1/2,R9为L2. 2.配置isis实现网络互通 R7配置如下: [Huawei]isis 1 [Huawei-isis- ...
- 调节LED的亮度
虽然Devices Plus已经介绍过Arduino的多种应用和作品示例,但是了解相关基础知识对于任何项目的构建仍然是非常重要的!这次,我们将为您介绍Arduino电子制作的基础知识.此次的分享嘉宾是 ...
- 教育法学期末考试02MOOC
期末考试 返回 期末考试试卷为客观题,总分为100分,占课程成绩的40%.其中包含16道单选题,2道多选题.共18道题.单选题每道5分,多选题每道10分,限时90分钟完成. 倒计时: 01:21: ...
- RK3588平台产测之ArmSoM-W3 DDR压力测试
1. 简介 RK3588从入门到精通 ArmSoM团队在产品量产之前都会对产品做几次专业化的功能测试以及性能压力测试,以此来保证产品的质量以及稳定性 优秀的产品都要进行多次全方位的功能测试以及性能压力 ...
- 2023_10_09_MYSQL_DAY_01_课后题
2023_10_09_MYSQL_DAY_01_课后题 #第三章 #1. 查询每名员工的员工姓名,入职时间. SELECT ename, hiredate FROM emp; #2. 查询部门表中部门 ...
- Required request body is missing缺失请求体
今天在写项目的时候前台传的参数后台一直接收不到,在网上搜了一些东西试了也没效果.后来发现是因为加了@RequestBody 去掉之后再次尝试就可以了.
- 挑战程序设计竞赛 2.2 poj 3040 Allowance 贪心
https://vjudge.csgrandeur.cn/problem/POJ-3040 /* 作为创纪录的牛奶产量的奖励,约翰决定每周给贝西一小笔零用钱.FJ拥有一组N(1 <= N < ...
- 空地一体化网络综述_Space-Air-Ground Integrated Network: A Survey
摘要 空地一体化网络(SAGIN)主要解决的是单一网络下的局限性问题,此综述文章从网络设计.资源分配.到性能的优化,对近几年SAGIN的总结. 引言 受限于网络容量和覆盖范围,仅依靠地面通信系统无法在 ...
- Util应用框架核心(三) - 服务注册器
本节介绍服务注册器的开发. 如果你不需要扩展Util应用框架,直接跳过. 当你把某些功能封装到自己的类库,并希望启动时自动执行初始化代码进行配置时,定义服务注册器. 服务注册器概述 服务注册器是Uti ...
- 单元测试之Mockito+Junit使用和总结
https://www.letianbiji.com/java-mockito/mockito-thenreturn.html Mockito 使用 thenReturn 设置方法的返回值 thenR ...