每天一例多线程[day2]-----synchronized与多个线程多个锁
发布日期:2021-06-30 13:44:57
浏览次数:2
分类:技术文章
本文共 1579 字,大约阅读时间需要 5 分钟。
package com.jeff.base.sync002;/** * 多个线程多个锁 * * 关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁, * 所以代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock), * * @author jeff * */public class MultiThread { private static int num = 0; /** static */ public static synchronized void printNum(String tag){ try { if(tag.equals("a")){ num = 100; System.out.println("tag a, set num over!"); Thread.sleep(1000); } else { num = 200; System.out.println("tag b, set num over!"); } System.out.println("tag " + tag + ", num = " + num); } catch (InterruptedException e) { e.printStackTrace(); } } //注意观察run方法输出顺序 public static void main(String[] args) { /** * 俩个不同的对象m1/m2: * 一个对象一把锁,m1和m2两个对象获得的是自己的那一把对象锁 ,两者没有任何关系,不存在同步问题。 * * 在静态类型的printNum方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class类)。 * m1和m2两个线程对象在访问printNum时,访问的是同一把锁, * 所以最终的结果一定是:要么先执行a的结果,再执行b的: * tag a, set num over! tag a, num = 100 tag b, set num over! tag b, num = 200 要么是先执行b的,再执行a的: tag b, set num over! tag b, num = 100 tag a, set num over! tag a, num = 200 * */ final MultiThread m1 = new MultiThread(); final MultiThread m2 = new MultiThread(); Thread t1 = new Thread(new Runnable() { @Override public void run() { m1.printNum("a"); } }); Thread t2 = new Thread(new Runnable() { @Override public void run() { m2.printNum("b"); } }); t1.start(); t2.start(); }}
如果把printNum方法的static关键词去掉,打印的结果:
tag a, set num over!tag b, set num over!tag b, num = 200tag a, num = 200也就是说,这两个线程之间获得的是自己的那一把锁, 多个线程多个锁,各自无影响。
转载地址:https://jeffsheng.blog.csdn.net/article/details/80556803 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
哈哈,博客排版真的漂亮呢~
[***.90.31.176]2024年04月17日 10时56分08秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
机器学习之重头戏-特征预处理
2019-05-01
synchronized底层实现及锁的升级、降级
2019-05-01
Java线程生命周期之旅
2019-05-01
机器学习-简单逻辑回归实现
2019-05-01
如何快速定位JVM相关GC问题
2019-05-01
java线程相关概念之解析
2019-05-01
Python清洗常用工具
2019-05-01
java内存模型及线程案例分析
2019-05-01
小议创建线程的若干方式
2019-05-01
ThreadLocal应用场景分析
2019-05-01
线程池原理及应用之个人心得
2019-05-01
线程池excute方法执行底层过程
2019-05-01
线程池同步异步调用callable和Future
2019-05-01
梯度算法之初见
2019-05-01
解决python安装库较慢的方式
2019-05-01
Maven安装问题总结
2019-05-01
Maven 插件配置,安装配置问题
2019-05-01
PermGen space-永久区内存溢出
2019-05-01
Maven继承和聚合
2019-05-01
maven私服nexus配置
2019-05-01