多个线程多个锁

多个线程多个锁:多个线程,每个线程都可以拿到自己制定的锁,分别获得锁之后,执行synchronized方法体的内容。就是在上次那个博客上说道的锁竞争的问题,是因为所有的线程过来以后都争抢同一个锁。如果说每个线程都可以或得到自己的锁,这样的话我们的锁竞争问题就没有了,如果这样做的话,我们去实例化一个对象,我们怎么可以保证多线程可以并行操作,并行操作完成之后又不会相互之间影响。最终的操作结果就是一样的,最简单的就是在类上面加上static,或者使用原子的方式,来避免锁竞争问题。

示例代码

package nihui.test.cn;public class MutliThread {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 (Exception e) {e.printStackTrace();}}public static void main(String[] args) {        final MutliThread m1 = new MutliThread();final MutliThread m2 = new MutliThread();        Thread t1 = new Thread(new Runnable() {        @Overridepublic void run() {m1.printNum("a");}});        Thread t2  = new Thread(new Runnable() {           @Overridepublic void run() {m2.printNum("b");                }});        t1.start();t2.start();  }
}

运行结果

示例总结:

关键字synchronized获取到的锁都是对象锁,而不是把一段代码(方法)当做锁,所以示例代码中那个线程先执行synchronized关键字的方法,那个线程就持有该方法所属的对象锁Lock,两个对象,线程获得就是两个不同的锁,他们互不影响。

有一种情况则是相同的锁,即在静态方法上夹上synchronized关键字,表示锁定.class 类,类一级别的锁(独占.class类)

java并发编程(二)多个线程多个锁相关推荐

  1. [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ...

    [Java并发编程(一)] 线程池 FixedThreadPool vs CachedThreadPool ... 摘要 介绍 Java 并发包里的几个主要 ExecutorService . 正文 ...

  2. Java 并发编程——Executor框架和线程池原理

    Java 并发编程系列文章 Java 并发基础--线程安全性 Java 并发编程--Callable+Future+FutureTask java 并发编程--Thread 源码重新学习 java并发 ...

  3. Java并发编程|第二篇:线程生命周期

    文章目录 系列文章 1.线程的状态 2.线程生命周期 3.状态测试代码 4.线程终止 4.1 线程执行完成 4.2 interrupt 5.线程复位 5.1interrupted 5.2抛出异常 6. ...

  4. 《Java并发编程的艺术》——线程(笔记)

    文章目录 四.Java并发编程基础 4.1 线程简介 4.1.1 什么是线程 4.1.2 为什么要使用多线程 4.1.3 线程优先级 4.1.4 线程的状态 4.1.5 Daemon线程 4.2 启动 ...

  5. Java并发编程:进程和线程之由来

    2019独角兽企业重金招聘Python工程师标准>>> Java多线程基础:进程和线程之由来 在前面,已经介绍了Java的基础知识,现在我们来讨论一点稍微难一点的问题:Java并发编 ...

  6. Java并发编程(08):Executor线程池框架

    本文源码:GitHub·点这里 || GitEE·点这里 一.Executor框架简介 1.基础简介 Executor系统中,将线程任务提交和任务执行进行了解耦的设计,Executor有各种功能强大的 ...

  7. Java并发编程(8)——常见的线程安全问题

    线程安全问题: 多个线程同时执行也能工作的代码就是线程安全的代码 如果一段代码可以保证多个线程访问的时候正确操作共享数据,那么它是线程安全的. 具体说明: java并发线程实战(1) 线程安全和机制原 ...

  8. Java并发编程:进程、线程、并行与并发

    一谈到Java并发编程,我们一般就会联想起进程.线程.并行.并发等等概念.那么这些概念都代表什么呢?进程与线程有什么关系?并发与并行又是什么关系呢? 01 进程与线程 进程是指程序的一次动态执行过程, ...

  9. 【Java 并发编程】多线程、线程同步、死锁、线程间通信(生产者消费者模型)、可重入锁、线程池

    并发编程(Concurrent Programming) 进程(Process).线程(Thread).线程的串行 多线程 多线程的原理 多线程的优缺点 Java并发编程 默认线程 开启新线程 `Ru ...

  10. Java 并发编程(二):如何保证共享变量的原子性?

    线程安全性是我们在进行 Java 并发编程的时候必须要先考虑清楚的一个问题.这个类在单线程环境下是没有问题的,那么我们就能确保它在多线程并发的情况下表现出正确的行为吗? 我这个人,在没有副业之前,一心 ...

最新文章

  1. 进阶必备:CNN经典论文代码复现 | 附下载链接
  2. 从Docker 到Jenkins 到Ansible的部署经验
  3. 利用Git Bash 远程访问服务器
  4. 车辆动力学基础(1)
  5. vue+element 封装公共js代码
  6. OA项目10:部门管理的三个细节问题的解决及处理懒加载问题
  7. C++Socket编程总结
  8. web.config forms节点中的属性的含义和用途
  9. RTCP协议解析--RR
  10. 服务器远程ghost,Ghost win7系统64位远程桌面连接教程
  11. 摄影培训社培训资料(上
  12. 兔兔 的 题解 —— 2020 CSP-J 多校赛 目录
  13. bzoj5369: [Pkusc2018]最大前缀和 状压Dp 计数Dp
  14. 一个img文件-实验吧
  15. 163music 反爬分析
  16. 【Redis】Redis介绍
  17. elementUI表格头添加图标-鼠标移入显示el-tooltip提示信息
  18. Mysql 不使用窗口函数实现分组排序 rank 别名问题
  19. 计算机主机光盘故障,电脑开机之后提示插入安装光盘的解决方法
  20. 一致 先验分布 后验分布_先验分布、后验分布、似然估计这几个概念是什么意思,它们之间的关系是什么?...

热门文章

  1. 前台setcookie之后从后台取出来_后台设置Cookie值,前台进行获取
  2. httpclient base64 文件上传_代码级别的上传下载神器
  3. 国网“泛在电力物联网”的战略与逻辑
  4. 关于int类型除以1000后保留两位小数的问题,并且在excel里打印出来
  5. DBA必知的mysql备份与还原的几大方法
  6. 大一下学期的自我目标
  7. 关于location.href几种用法的区别
  8. DHCP通过NAP认证
  9. 被360整的体无完肤,我真的怒了!
  10. java学习:理解final