对象级别锁 vs 类级别锁(Java)
前言
对于多线程(并发)和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)的更多相关文章
- 对象级别锁 vs 类级别锁 – Java
同步针对的是多线程.同步的方法或代码块同时只能由一个线程执行. Java支持多线程来执行.这可能会导致两个或多个线程访问同一个字段或对象.同步是一个使所有并发执行的线程同步的过程.同步避免了由于共享内 ...
- Java synchronized对象级别与类级别的同步锁
Java synchronized 关键字 可以将一个代码块或一个方法标记为同步代码块.同步代码块是指同一时间只能有一个线程执行的代码,并且执行该代码的线程持有同步锁.synchronized关键字可 ...
- jQuery插件开发全解析,类级别与对象级别开发
jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...
- Jquery类级别与对象级别插件开发
jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...
- Java锁Synchronized,对象锁和类锁举例
Java的锁分为对象锁和类锁. 1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内针对该对象的操作只能有一个线程得到执行.另一个线程必须 ...
- Java锁Synchronized对象锁和类锁区别
java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...
- Java对象锁和类锁全面解析(多线程synchronized关键字)
最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...
- java的对象锁和类锁
在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...
- java 对象锁和类锁的区别(转)
java 对象锁和类锁的区别 转自; ) ); ; ) ); 上述的代码,第一个方法时用了同步代码块的方式进行同步,传入的对象实例是this,表明是当前对象,当然,如果需要同步其他对象实例,也不可 ...
随机推荐
- 包容网关 Inclusive Gateway
包容网关 Inclusive Gateway 作者:Jesai 2018年3月25日 22:59:56 什么是包容网关? 包容网关(Inclusive Gateway)就是并行网关(Parallel ...
- Exception in thread "main" java.lang.AbstractMethodError: org.springframework.boot.context.config.ConfigFileApplicationListener.supportsSourceType(Ljava/lang/Class;)Z
依赖冲突,查看pom.xml文件 查看parent项目的依赖版本为 <parent> <groupId>org.springframework.boot</groupId ...
- 【java面试】集合类篇
java中主要的类集合接口如下 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├Has ...
- 部署Maven项目到tomcat报错:java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderLi
Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL 严重: Error config ...
- 正斜杠(" / ")和反斜杠(" \ ")的区别
反斜杠“\”是电脑出现了之后为了表示程序设计里的特殊含义才发明的专用标点.所以除了程序设计领域外,任何地方都不应该使用反斜杠. 如何区分正反斜杠 英语:"/" 英文是forward ...
- SpringBoot与缓存
一.Spring Boot与缓存. JSR-107.Spring缓存抽象.整合Redis 一.JSR107 Java Caching定义了5个核心接口,分别是CachingProvider, Cach ...
- jmeter使用—响应断言
断言的作用:一个HTTP请求发出去,怎么判断执行的任务是否成功呢?通过检查服务器响应数据,是否返回预期想要的数据,如果是,判断任务成功,反之任务失败. 1.添加断言:选中一个取样器,右键->添加 ...
- jmeter使用—正则表达式提取器
当我们测试接口的时候,有些请求参数是需要从上个接口返回获取的数据,这样的话我们就需要用到关联了.今天我们使用的关联是正则表达式提取器来进行获取需要关联的数据. 下面来具体说明正则表达式提取器的使用方法 ...
- SparkSQL 如何自定义函数
1. SparkSql如何自定义函数 2. 示例:Average 3. 类型安全的自定义函数 1. SparkSql如何自定义函数? spark中我们定义一个函数,需要继承 UserDefinedAg ...
- day05【数组】
day05[数组] 1.数组 概念:是一种容器,可以同时存放多个数据. 特点: 数组是一种引用数据类型 数组当中的多个数据,类型必须统一 数组的长度在程序的运行期间不可改变 初始化:在内存当中创建一个 ...