synchronized使用场景及区别
参考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使用场景及区别相关推荐
- Synchronized与Lock的区别与应用场景
同步代码块,同步方法,或者是用java提供的锁机制,我们可以实现对共享资源变量的同步控制. 技术点: 1.线程与进程: 在开始之前先把进程与线程进行区分一下,一个程序最少需要一个进程,而一个进程最少需 ...
- synchronized与Lock的区别与使用
原文链接 https://blog.csdn.net/u012403290/article/details/64910926 ###引言: 昨天在学习别人分享的面试经验时,看到Lock的使用.想起自己 ...
- 题目:三个售票员 卖出 30张票 || 多线程编程的企业级套路+模板||synchronized与Lock的区别
package com.dym.juc;//资源类 class Ticket {private int number =30;public synchronized void saleTicket() ...
- 超图球面与平面场景的区别和地理坐标系
前文在超图桌面版中加载了一个3dmax模型:是加载到球面场景中的:看一下能不能加载到平面场景:加载到平面场景,出现下图错误:提示数据集的坐标系是地理坐标系,不能添加到平面场景, 为什么地理坐标系不能加 ...
- Java多线程之Synchronized和Lock的区别
Java多线程之Synchronized和Lock的区别 目录: 原始构成 使用方法 等待是否可以中断 加锁是否公平 锁绑定多个条件Condition 小结:Lock相比较Synchronized的优 ...
- Java之多线程里面的锁理解以及synchronized与Lock的区别
一.宏观的说下锁的分类 1)锁分为乐观锁.悲观锁 悲观锁认为对于同一个数据的并发操作,一定是会发生修改的,哪怕没有修改,也会认为修改.因此对于同一个数据的并发操作,悲观锁采取加锁的形式.悲观的认为,不 ...
- day 23-24 面试题:synchronized和volatile的区别;final,finally,finalize区别
面试题: 1. synchronized和volatile的区别 2. final,finally,finalize区别 1. synchronized和volatile的区别 1.1 JVM内存模型 ...
- 既生synchronized,何生volatile (synchronized与volatile的区别)
既生synchronized,何生volatile (synchronized与volatile的区别) 我们知道,synchronized和volatile两个关键字是Java并发编程中经常用到的两 ...
- synchronized与ReetrantLock的区别
synchronized与ReetrantLock的区别(个人见解,如果不对,请勿喷) 相同之处: 1.两者都是同时实现了锁的功能 2.两者都是可重入锁 不同之处: (1)synchronized是独 ...
最新文章
- 腾讯AI足球队夺冠Kaggle竞赛,绝悟AI强化学习框架通用性凸显
- 清除AD中残留的Exchange2003服务器信息
- 计算机数据库技术应用了什么,2018年全国计算机三级数据库技术考试考什么内容...
- Axios——Axios封装DEMO
- 8.10-11 mount、umount
- 渡劫飞升的伪原创工具
- ROS入门笔记(二):ROS安装与环境配置及卸载(重点)
- java list对象按照某个属性去重
- java 二叉排序_java实现二叉排序树
- “十亿赌约”,雷军输,董明珠胜?
- 计算机职称考试如何知道这道题对错,职称计算机考试Excel判断试题2017
- Vue3.0快速上手-重要知识点罗列-系列二
- 产品体验报告:百词斩————英语学习的领跑者
- PS制作火焰效果文字的方法步骤教程
- C语言学习笔记(自用)(1):初识C语言
- 系统弱口令检测与网络端口扫描
- Win 98系统启动过程全揭密
- C++判断素数(求素数)
- 你的公司怎么样激励员工?
- 什么是OA?(OA系统-协同网络办公)