前言

对于多线程(并发)和Spring Boot这两块在同步进行学习中,在看到使用synchronized关键字使操作同步时,看到和C#中不一样的东西,所以这里呢,就深入学习了下,若有错误之处,还望指正。

对象级别锁 vs 类级别锁

我们知道由于并发会导致线程不安全的问题,此时我们手段之一采取线程同步,也就是说使得所有并发线程在执行中保持同步的过程,当方法声明为同步时,传递到同步块中的对象称之为监视器或锁定对象,如果有另外一个线程也在执行该同步方法,那么该线程将被阻塞,直到线程释放该监视器或锁定对象。我们在类中已定义的方法或块上使用synchronized关键字,同时synchronized关键字不能与类定义中的变量或属性一起使用。

对象级别锁

所谓的对象级别锁,也就是针对非静态方法执行同步块锁定,那么同步块中的监视器或锁定对象则是基于对象实例,有如下三种形式

class Test {
public synchronized void LockMethod() {
}
}

或者

class Test {
public void LockMethod() {
synchronized(this)
{
}
}
}

或者

class Test {
private final Object lock = new Object(); public void LockMethod() {
synchronized (lock) {
}
}
}

类级别锁

若在同步方法中存在静态数据,为保持静态数据线程安全,我们则需使用类级别锁,这意味着,如果在运行时有多个实例的Test,则一次只能在一个实例中的一个线程上执行一个线程LockMethod(),而所有其他实例将被其他线程锁定。针对类级别锁,那么同步块中监视器或锁定对象有如下三种形式:

class Test {
public synchronized static void LockMethod() {
}
}

class Test {
public void LockMethod() {
synchronized (Test.class)
{
}
}
}

class Test {
private final static Object lock = new Object(); public void LockMethod() {
synchronized (lock) {
}
}
}

在这里我主要是看到了上述第二种形式中所使用的锁定对象,由于java和C#语法大多相似,但是这在C#中找不到可对比的东西,我不明白这到底是什么个意思,所以就深入看了些,本以为可以直接查看源码,然而并没有任何反应,看来就是Java中天然存在的了,我去打印发现和获取实例的类名的结果是一样的,我们将这种情况翻译为className.class,这到底是什么意思呢?为何上述第二种形式就是类级别锁定从而保证线程安全了呢?

System.out.println(Test.class.toString());
System.out.println(new Test().getClass());

于是乎我想到看一下所购买的《深入理解Java虚拟机》中对于类加载原理的解释,结果发现:在类加载时机的第一阶段也就是加载阶段,虚拟机会完成3件事情,其中最后一件事情则是在内存中生成一个对应类的java.lang.Class对象,作为方法区这个类的各种数据的入口。换句话说,每个类在JVM中有且只会有唯一的一个java.lang.Class对象,所以我大胆猜测className.class就是获取java.lang.Class对象唯一引用,如此一来就保证始终只有一个线程能够进入同步块。

总结

本节我们通过对关键字synchronized实现线程同步做了详细了解,其实并不难,这里我想表达的是看到和C#中不一样的东西,也就是className.class具体是什么意思,同时在用java实现单例模式中也有这种情况,所以详细学习了下,也做个备忘录,可能对大部分学java的童鞋而言确实很简单,我还是处于初级阶段,也是在一步步深入的学习。

对象级别锁 vs 类级别锁(Java)的更多相关文章

  1. 对象级别锁 vs 类级别锁 – Java

    同步针对的是多线程.同步的方法或代码块同时只能由一个线程执行. Java支持多线程来执行.这可能会导致两个或多个线程访问同一个字段或对象.同步是一个使所有并发执行的线程同步的过程.同步避免了由于共享内 ...

  2. Java synchronized对象级别与类级别的同步锁

    Java synchronized 关键字 可以将一个代码块或一个方法标记为同步代码块.同步代码块是指同一时间只能有一个线程执行的代码,并且执行该代码的线程持有同步锁.synchronized关键字可 ...

  3. jQuery插件开发全解析,类级别与对象级别开发

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  4. Jquery类级别与对象级别插件开发

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  5. Java锁Synchronized,对象锁和类锁举例

    Java的锁分为对象锁和类锁. 1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内针对该对象的操作只能有一个线程得到执行.另一个线程必须 ...

  6. Java锁Synchronized对象锁和类锁区别

    java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...

  7. Java对象锁和类锁全面解析(多线程synchronized关键字)

    最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...

  8. java的对象锁和类锁

    在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...

  9. java 对象锁和类锁的区别(转)

    java 对象锁和类锁的区别   转自; ) ); ; ) ); 上述的代码,第一个方法时用了同步代码块的方式进行同步,传入的对象实例是this,表明是当前对象,当然,如果需要同步其他对象实例,也不可 ...

随机推荐

  1. 系列免费课程汇总(Java、单体应用、微服务、物联网、SaaS)

    概述 2020年春节尽在眼前,又忙碌了一年的你一定有很多收获:是升职加薪,还是收获爱情?是买房置业,还是新添人口? 我在2019年的最大收获是:我的第二枚千金诞生,使我顺利加入富豪行列! 新年伊始我们 ...

  2. Java单体应用 - 架构模式 - 01.三层架构

    原文地址:http://www.work100.net/training/monolithic-architecture-3level.html 更多教程:光束云 - 免费课程 三层架构 序号 文内章 ...

  3. Android studio 连接真机

    首先用数据线连接真机 1.打开开发者模式(小米手机mix2s为例 设置->我的设备->全部参数->连续点击MIUI版本——开启成功) 2.在更多设置中找到系统安全设置——允许安装未知 ...

  4. 【模板】2-SAT问题

    问题简述 有 \(n\) 个变量,每个变量可赋为 \(1\) 或 \(0\) 必须满足一些限制条件,如" \(a\) 为1 或 \(b\) 为0 " " \(a\) 为0 ...

  5. HDU-2841 Visible Trees(莫比乌斯反演)

    Visible Trees 传送门 解题思路: 实际上的答案就是1~n与1~m之间互质的数的对数,写出式子就是 \(ans=\sum^{n}_{i=1}\sum^{m}_{j=1}[gcd(i,j)= ...

  6. STM8 ADC 多个通道连续扫描缓冲区数据带中断模式的正确写法

    近日调试了STM8S的ADC采集多通道数据的程序,按照之前的立即,将ADC1设置为:扫描模式,连续采集,数据缓存模式,中断使能后应该可以在中断后读取到数值了,可是无论怎样都只能读取到第一个缓冲器的数据 ...

  7. 85道Java微服务面试题整理(助力2020面试)

    微服务 面试题 1.您对微服务有何了解? 2.微服务架构有哪些优势? 3.微服务有哪些特点? 4.设计微服务的最佳实践是什么? 5.微服务架构如何运作? 6.微服务架构的优缺点是什么? 7.单片,SO ...

  8. ros机器人之小乌龟仿真-路径记录

    ------------恢复内容开始------------ 通过自己不断地摸索,对ros系统有了一定的了解,首先装系统,这一过程中也遇到了很多问题,但通过不断地尝试,经过一天一夜的倒腾,总算是把系统 ...

  9. 好机会,我要帮女同事解决Maven冲突问题

    任何一个故事起因最重要 任何一个职业,女生都有绝对的优势.更别提IT行业了,在部门中要是有女程序猿那肯定是香饽饽,备受呵护呀. 之前有一次,一位刚来的妹子遇到问题了,画风顿时就变成上面的图片了,群起而 ...

  10. sql server如何判断数据库是否存在

    如何判断数据库是否存在       执行下列的SQL,获得一张表,根据表的行数来判断. select * from master..sysdatabases where name=N'所查询的数据库名 ...