参考syn锁:https://www.cnblogs.com/lixuwu/p/5676143.html

实例对象级别的锁和类对象级别的锁区别 一个锁的是类对象,一个锁的是实例对象。 若类对象被lock,则类对象的所有同步方法全被lock;

若实例对象被lock,则该实例对象的所有同步方法全被lock

  • 对象锁

1、实例对象级别的锁

private final Object lock = new Object();

public void demoMethod(){ synchronized (lock){ //other thread safe code } }

private Object lock = new Object();

public void demoMethod(){ synchronized (lock){ //other thread safe code } }

synchronized (this) { //other thread safe code }

2、类对象级别的锁

private final static Object lock = new Object();

public void demoMethod(){ synchronized (lock){ //other thread safe code } }

private static Object lock = new Object();

public void demoMethod(){ synchronized (lock){ //other thread safe code } }

类锁

synchronized (DemoClass.class){ //other thread saf

有如下例子:

package lockUtils.区别锁实例对象和类对象;/**** @when*/
class MyThread implements Runnable {private TrySynLock trySynLock;private int num;public MyThread(TrySynLock trySynLock, int num) {this.trySynLock = trySynLock;this.num = num;}public void run() {while (true){trySynLock.printNum(num);try {Thread.sleep(5*1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Test {public static void main(String[] args) {TrySynLock t = new TrySynLock();TrySynLock t1 = new TrySynLock();TrySynLock t2 = new TrySynLock();Thread a = new Thread(new MyThread(t, 1));Thread b = new Thread(new MyThread(t1, 2));Thread c = new Thread(new MyThread(t2, 3));a.start();b.start();c.start();/*** 结果* \Thread[Thread-0,5,main]0 1 2 3 4 5 Thread[Thread-1,5,main]0 1 2 6 7 8 3 4 5 6 7 8 9 10 11 12 13 14 9 10 11 12 13 14 15 16 17 18 15 16 17 19 20 21 22 23 24 18 19 20 21 22 23 24开始加锁:当前线程Thread[Thread-0,5,main]开始加锁:当前线程Thread[Thread-1,5,main]0 1 2 3 0 4 1 5 2 6 7 8 9 34 5 6 7 8 9开始加锁:当前线程开始加锁:当前线程Thread[Thread-1,5,main]Thread[Thread-0,5,main]0 1 2 3 4 5 6 7 8 90 1 2 3 4 5 6 7 8 9* 在上边的例子中试图使用这种方法达到互斥方法打印方法,但是事实是这样做是没有效果的,因为每个Trans对象都有自己的Object对象,* 这两个对象都有自己的锁,所以两个线程需要的是不同锁,两个锁之间没有任何相互作用,不会起到同步作用。* @when*//*** 上边的代码稍作修改就可以起到互斥作用,将Trans类中Object对象的声明改为下面这样:private static Object lock = new Object();* @when*/}}

2;

package lockUtils.区别锁实例对象和类对象;public class TrySynLock {/***实例对象级别的锁private final Object lock = new Object();public void demoMethod(){synchronized (lock){//other thread safe code}}synchronized (this) {//other thread safe code}类对象级别的锁private final static Object lock = new Object();public void demoMethod(){synchronized (lock){//other thread safe code}}private  static Object lock = new Object();public void demoMethod(){synchronized (lock){//other thread safe code}}* @when*//*****private Object lock = new Object();private static Object lock = new Object();private final Object lock = new Object();private static final Object lock = new Object();final:开始加锁:当前线程Thread[Thread-2,5,main]0 Thread[Thread-2,5,main]1 Thread[Thread-2,5,main]开始加锁:当前线程Thread[Thread-1,5,main]0 Thread[Thread-1,5,main]1 Thread[Thread-1,5,main]2 Thread[Thread-2,5,main]2 Thread[Thread-1,5,main]* @when*/private static final Object lock = new Object();public void printNum(int num){synchronized (lock) {System.out.print("开始加锁:当前线程");System.out.print(Thread.currentThread());for(int i=0;i<3;i++){System.out.print(i+" "+Thread.currentThread());}System.out.println();}}
}

test.java

package lockUtils.区别锁实例对象和类对象;/**** @when*/
class MyThread implements Runnable {private TrySynLock trySynLock;private int num;public MyThread(TrySynLock trySynLock, int num) {this.trySynLock = trySynLock;this.num = num;}public void run() {while (true){trySynLock.printNum(num);try {Thread.sleep(5*1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}public class Test {public static void main(String[] args) {TrySynLock t = new TrySynLock();TrySynLock t1 = new TrySynLock();TrySynLock t2 = new TrySynLock();Thread a = new Thread(new MyThread(t, 1));Thread b = new Thread(new MyThread(t1, 2));Thread c = new Thread(new MyThread(t2, 3));a.start();b.start();c.start();/*** 结果* \Thread[Thread-0,5,main]0 1 2 3 4 5 Thread[Thread-1,5,main]0 1 2 6 7 8 3 4 5 6 7 8 9 10 11 12 13 14 9 10 11 12 13 14 15 16 17 18 15 16 17 19 20 21 22 23 24 18 19 20 21 22 23 24开始加锁:当前线程Thread[Thread-0,5,main]开始加锁:当前线程Thread[Thread-1,5,main]0 1 2 3 0 4 1 5 2 6 7 8 9 34 5 6 7 8 9开始加锁:当前线程开始加锁:当前线程Thread[Thread-1,5,main]Thread[Thread-0,5,main]0 1 2 3 4 5 6 7 8 90 1 2 3 4 5 6 7 8 9* 在上边的例子中试图使用这种方法达到互斥方法打印方法,但是事实是这样做是没有效果的,因为每个Trans对象都有自己的Object对象,* 这两个对象都有自己的锁,所以两个线程需要的是不同锁,两个锁之间没有任何相互作用,不会起到同步作用。* @when*//*** 上边的代码稍作修改就可以起到互斥作用,将Trans类中Object对象的声明改为下面这样:private static Object lock = new Object();* @when*/}}

synchronized使用场景及区别相关推荐

  1. Synchronized与Lock的区别与应用场景

    同步代码块,同步方法,或者是用java提供的锁机制,我们可以实现对共享资源变量的同步控制. 技术点: 1.线程与进程: 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需 ...

  2. synchronized与Lock的区别与使用

    原文链接 https://blog.csdn.net/u012403290/article/details/64910926 ###引言: 昨天在学习别人分享的面试经验时,看到Lock的使用.想起自己 ...

  3. 题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别

    package com.dym.juc;//资源类 class Ticket {private int number =30;public synchronized void saleTicket() ...

  4. 超图球面与平面场景的区别和地理坐标系

    前文在超图桌面版中加载了一个3dmax模型:是加载到球面场景中的:看一下能不能加载到平面场景:加载到平面场景,出现下图错误:提示数据集的坐标系是地理坐标系,不能添加到平面场景, 为什么地理坐标系不能加 ...

  5. Java多线程之Synchronized和Lock的区别

    Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...

  6. Java之多线程里面的锁理解以及synchronized与Lock的区别

    一.宏观的说下锁的分类 1)锁分为乐观锁.悲观锁 悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改.因此对于同一个数据的并发操作,悲观锁采取加锁的形式.悲观的认为,不 ...

  7. day 23-24 面试题:synchronized和volatile的区别;final,finally,finalize区别

    面试题: 1. synchronized和volatile的区别 2. final,finally,finalize区别 1. synchronized和volatile的区别 1.1 JVM内存模型 ...

  8. 既生synchronized,何生volatile (synchronized与volatile的区别)

    既生synchronized,何生volatile (synchronized与volatile的区别) 我们知道,synchronized和volatile两个关键字是Java并发编程中经常用到的两 ...

  9. synchronized与ReetrantLock的区别

    synchronized与ReetrantLock的区别(个人见解,如果不对,请勿喷) 相同之处: 1.两者都是同时实现了锁的功能 2.两者都是可重入锁 不同之处: (1)synchronized是独 ...

最新文章

  1. 腾讯AI足球队夺冠Kaggle竞赛,绝悟AI强化学习框架通用性凸显
  2. 清除AD中残留的Exchange2003服务器信息
  3. 计算机数据库技术应用了什么,2018年全国计算机三级数据库技术考试考什么内容...
  4. Axios——Axios封装DEMO
  5. 8.10-11 mount、umount
  6. 渡劫飞升的伪原创工具
  7. ROS入门笔记(二):ROS安装与环境配置及卸载(重点)
  8. java list对象按照某个属性去重
  9. java 二叉排序_java实现二叉排序树
  10. “十亿赌约”,雷军输,董明珠胜?
  11. 计算机职称考试如何知道这道题对错,职称计算机考试Excel判断试题2017
  12. Vue3.0快速上手-重要知识点罗列-系列二
  13. 产品体验报告:百词斩————英语学习的领跑者
  14. PS制作火焰效果文字的方法步骤教程
  15. C语言学习笔记(自用)(1):初识C语言
  16. 系统弱口令检测与网络端口扫描
  17. Win 98系统启动过程全揭密
  18. C++判断素数(求素数)
  19. 你的公司怎么样激励员工?
  20. 什么是OA?(OA系统-协同网络办公)

热门文章

  1. 有趣的无领导小组讨论题目_讨论困难,但同样有趣
  2. 核心概念 —— 契约(Contracts)
  3. 中科软测试面试题2019_中科软测试工程师面试题
  4. 课程设计2:交通灯仿真设计
  5. 99套经典网页设计模版 网页设计模板 学习网页制作
  6. 国人对国产操作系统的误会
  7. MTK6577+Android内核配置makemenuconfig
  8. 基于SSM大学生心理健康咨询系统
  9. C#编码格式转换,Url,escape,unicode编码和解码
  10. 修复损坏的磁盘分区表