
Java-------对Synchronized锁的理解
发布日期:2021-05-06 19:32:56
浏览次数:23
分类:精选文章
本文共 1449 字,大约阅读时间需要 4 分钟。
Java对于多线程是有自己的处理方式的,但是锁的机制来来回回看了好几遍 每次都有新的理解、甚至不同。
今天又看了几篇博主的文章,也不知道理解的对不对,决定把自己的见解记录下来。过后有新的见解会再加上或更改 Java 为了实现多线程同步,有锁机制,大致有Lock 和 synchronized两种方法 这篇为了记录对synchronized锁对象的理解,过后会写Lock 1 、 synchronized的用法: 大概就是sybchronized 后面加个(锁对象){} 大括号里面的代码就被“锁住了” ,或者是直接修饰方法|静态方法 2、 锁对象 顾名思义,是个对象,但是一定是相同的对象才会触发锁机制,两个不同地址值的对象被synchronized括起来是不会触发锁机制的比如: 小 1、public Demo1 { public test () { String str = new String("abc"); //不同的对象会创建不同==地址==的str 这里不讨论string的创建方法放进常量池的问题 synchronized (str) { //do something } }}
(ps:我就不写线程代码去执行了,感觉还不如文字来的舒服)
这时候如果创建了两个Demo1对象 d1 、d2 那么d1 和 d2 之间是不会相互影响的。如果是两个线程t1、t2都调用d1的test()方法 那么 就是收到synchronized的约束。一定会按照顺序执行。 如果直接用sybchronized 修饰方法是一样的结果 几乎等效于 synchronized(this) 问题来了 如果我想 多个线程处理不同的对象 还想让方法之间同步 应该怎么做,那就创建一个相同的对象 还是上面的代码public Demo1 { ==private static Strings str = new String("abc");== public test () { synchronized (str) { //do something } }}
这时候静态变量是不变的所以 即使是两个线程调用两个对象 也是一个地址的锁对象 是会受到锁机制影响的
利用这个机制呢 我们可以处理两个方法的相互制约,也就是两个方法用相同的锁对象 就可以达到同一时间只能执行一个方法
的问题public Demo1 { ==private static Strings str = new String("abc");== public test () { synchronized (str) { //do something } } public test2() { synchronized (str) { //do something } }}
test 和 test2 方法是相互制约的
sybchronized 大概方法记录到此,虽然对多线程处理有好处,但是也不要乱用 因为同步毕竟会影响性能,能用其他方式处理的就不要用synchronized发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年05月08日 11时10分15秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Kubernetes网络插件使用详解
2023-01-29
Kubernetes调度单位Pod
2023-01-29
Kubernetes部署Dashboard实战
2023-01-29
Kubernetes集群升级实战
2023-01-29
KuiperInfer深度学习推理框架-源码阅读和二次开发(3):计算图
2023-01-29
KxMenu下拉菜单
2023-01-29
KXML2部分详解(J2ME)
2023-01-29
KXML解释本地或网络上的XML文件
2023-01-29
Lambda 实现超强排序
2023-01-30
lambda表达式与匿名内部类与双冒号(::)
2023-01-30
Lammp安装过程
2023-01-30
lamp 一键安装
2023-01-30
Lamp(Fpm-Php)基本配置
2023-01-30
laradock 安装使用 kafka
2023-01-30
laravel 5.3 给容器传参
2023-01-30
laravel 5.5 -- Eloquent 模型关联
2023-01-30
laravel mix
2023-01-30
Laravel Passport
2023-01-30