Java 中对象锁和类锁的区别? 关键字 Synchronized的用法?
一 对象锁和类锁的关系
- /*
- *
- 对象锁和【类锁】 全局锁的关系?
- 对象锁是用于对象实例方法,或者一个对象实例上的 this
- 类锁是用于类的静态方法或者一个类的class对象上的。 Ag.class
- 我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,
- 所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。
- */
对象锁, 不同对象。
- public class SynchrDemo {
- public static void main(String[] args) {
- Thread1 thread1 = new Thread1();
- Thread1 thread2 = new Thread1();
- thread1.start();
- thread2.start();
- }
- }
- class Ag{
- public void show(){
- // this 是当前对象的实例,由于新建两个对象,不是同一对象。所以这里是锁不住的。 代码快的方式,比修饰在方法上更细化控制。
- synchronized (this) {
- for (int i = 0; i < 4; i++) {
- System.out.println(Thread.currentThread().getName() + " i=" + i);
- }
- }
- }
- }
- class Thread1 extends Thread{
- @Override
- public void run() {
- //这里是新建对象 主方法中new了两个thread,就是new了两个Ag对象
- Ag ag = new Ag();
- ag.show();
- }
- }
关键字修饰方法
- public class SynchrDemo {
- public static void main(String[] args) {
- Thread1 thread1 = new Thread1();
- Thread1 thread2 = new Thread1();
- thread1.start();
- thread2.start();
- }
- }
- class Ag{
- // 这次修饰的是方法,范围比代码块要大,意味着在这个区域内,锁生效的时候,都是在阻塞,其他线程的等待时间就会增加。
- // 这次实验的非同一对象,所以这里的锁是不起作用的。
- public synchronized void show(){
- for (int i = 0; i < 4; i++) {
- System.out.println(Thread.currentThread().getName() + " i=" + i);
- }
- }
- }
- class Thread1 extends Thread{
- @Override
- public void run() {
- //这里是新建对象 主方法中new了两个thread,就是new了两个Ag对象
- Ag ag = new Ag();
- ag.show();
- }
- }
二 对象锁 同一对象
- package com.aaa.threaddemo;
- /*
- * 一 Java中的关键字 synchronized 是啥?
- * synchronized是Java提供的一个并发控制的关键字。
- *
- * 用法:同步方法 和 同步代码块。
- * 可以修饰方法 也可以 修饰代码块。
- *
- * 作用: 被synchronized修饰的代码块及方法,在同一时间,只能被单个线程访问。【保证线程安全】
- 1 修饰方法和代码块有什么不同?
- 二者的结果是一样的
- 修饰方法时,作用域是整个方法,控制的范围大。
- synchronized 代码块 可控制具体的作用域,更精准控制提高效率。
- 减少阻塞带来的时间问题。
- 2 同步锁的给谁用的?
- 同步锁基于对象,只要锁的来源一致,即可达到同步的作用。
- 所以,但对象不一样,则不能达到同步效果。
- 3 synchronized修饰方法,代码块,锁未释放,此时,其他线程调用同一对象的其他被synchronized修饰的方法,代码块,会如何?
- 当线程 A 调用某对象的synchronized 方法 或者 synchronized 代码块时,若同步锁未释放,
- 其他线程调用同一对象的其他 synchronized 方法 或者 synchronized 代码块时将被阻塞,直至线程 A 释放该对象的同步锁。(注意:重点是其他)
- 4 调用非synchronized方法 ,代码快呢?
- 当线程 A 调用某对象的synchronized 方法 或者 synchronized 代码块时,无论同步锁是否释放,
- 其他线程调用同一对象的其他 非 synchronized 方法 或者 非 synchronized 代码块时可立即调用。
- 5 全局锁如何实现?
- 全局锁: 锁住整个 Class,而非某个对象或实例。1-4都是实例锁
- 实现: 静态 synchronized 方法
- static 声明的方法为全局方法,与对象实例化无关,
- 所以 static synchronized 方法为全局同步方法,与对象实例化无关。
- 6 synchronized 具体 Class 的代码块?
- synchronized (Ag.class) 获得的同步锁是全局的,
- static synchronized 获得的同步锁也是全局的,同一个锁,所以达到同步效果。
- 7 对象锁和【类锁】 全局锁的关系?
- 对象锁是用于对象实例方法,或者一个对象实例上的 this
- 类锁是用于类的静态方法或者一个类的class对象上的。 Ag.class
- 我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,
- 所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。
- *
- *
- */
- /*
- *
- 对象锁和【类锁】 全局锁的关系?
- 对象锁是用于对象实例方法,或者一个对象实例上的 this
- 类锁是用于类的静态方法或者一个类的class对象上的。 Ag.class
- 我们知道,类的对象实例可以有很多个,但是每个类只有一个class对象,
- 所以不同对象实例的对象锁是互不干扰的,但是每个类只有一个类锁。
- */
- public class SynchrDemo {
- public static void main(String[] args) {
- // 改造后,可以确保是同一对象 验证 synchronized 是否生效
- Ag ag = new Ag();
- Thread1 thread1 = new Thread1(ag);
- Thread1 thread2 = new Thread1(ag);
- thread1.start();
- thread2.start();
- }
- }
- class Ag{
- // 这次修饰的是方法,范围比代码块要大,意味着在这个区域内,锁生效的时候,都是在阻塞,其他线程的等待时间就会增加。
- // 这次实验的同一对象,所以这里的锁是起作用的。
- public synchronized void show(){
- for (int i = 0; i < 4; i++) {
- System.out.println(Thread.currentThread().getName() + " i=" + i);
- }
- }
- }
- /*
- * 改造一些 对象的生成,确保在Thread1 中获得的是同一对象
- */
- class Thread1 extends Thread{
- private Ag mag;
- public Thread1(Ag ag) {
- mag = ag;
- }
- @Override
- public void run() {
- mag.show();
- }
- }
验证代码快的方式?
- public class SynchrDemo {
- public static void main(String[] args) {
- // 改造后,可以确保是同一对象 验证 synchronized 是否生效
- Ag ag = new Ag();
- Thread1 thread1 = new Thread1(ag);
- Thread1 thread2 = new Thread1(ag);
- thread1.start();
- thread2.start();
- }
- }
- class Ag{
- // 这次修饰的是方法,范围比代码块要大,意味着在这个区域内,锁生效的时候,都是在阻塞,其他线程的等待时间就会增加。
- // 这次实验的同一对象,所以这里的锁是起作用的。
- public void show(){
- synchronized (this) {
- for (int i = 0; i < 4; i++) {
- System.out.println(Thread.currentThread().getName() + " i=" + i);
- }
- // this 就是当前的对象,我们现在获得就是同一对象
- System.out.println(this);
- }
- }
- }
- /*
- * 改造一些 对象的生成,确保在Thread1 中获得的是同一对象
- */
- class Thread1 extends Thread{
- private Ag mag;
- public Thread1(Ag ag) {
- mag = ag;
- }
- @Override
- public void run() {
- mag.show();
- }
- }
三 类锁? 非同一对象
- /*
- *
- * 类锁,全局锁如何实现?
- 全局锁: 锁住整个 Class,而非某个对象或实例
- 实现:
- 1 在静态方法上用 synchronized 关键字修饰
- 2 在代码块上使用 类名.class
- static 声明的方法为全局方法,与对象实例化无关,
- 所以 static synchronized 方法为全局同步方法,与对象实例化无关。
- */
- public class SynchrDemo {
- public static void main(String[] args) {
- //非同一对象
- Thread2 thread1 = new Thread2();
- Thread2 thread2 = new Thread2();
- thread1.start();
- thread2.start();
- }
- }
- class Ag{
- public void show(){
- // 使用 synchronized() 方法,将锁控制在代码快上。
- synchronized (Ag.class) {
- for (int i = 0; i < 4; i++) {
- System.out.println(Thread.currentThread().getName() + " i=" + i);
- }
- // this 就是当前的对象,我们现在获得就是非同一对象
- System.out.println(this);
- }
- }
- }
- class Thread2 extends Thread{
- @Override
- public void run() {
- Ag ag = new Ag();
- ag.show();
- }
- }
测试 关键字修饰 static 方法
- public class SynchrDemo {
- public static void main(String[] args) {
- //非同一对象
- Thread2 thread1 = new Thread2();
- Thread2 thread2 = new Thread2();
- thread1.start();
- thread2.start();
- }
- }
- class Ag{
- // 静态的方法 被synchronized 修饰后, 锁住的是 类。
- public static synchronized void show(){
- for (int i = 0; i < 4; i++) {
- System.out.println(Thread.currentThread().getName() + " i=" + i);
- }
- }
- }
- class Thread2 extends Thread{
- @Override
- public void run() {
- Ag ag = new Ag();
- ag.show();
- }
- }
Java 中对象锁和类锁的区别? 关键字 Synchronized的用法?的更多相关文章
- 理解Java中对象基础Object类
一.Object简述 源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面. 所以在Java中有一句常说的话,一切皆对象, ...
- Java锁Synchronized,对象锁和类锁举例
Java的锁分为对象锁和类锁. 1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内针对该对象的操作只能有一个线程得到执行.另一个线程必须 ...
- Java锁Synchronized对象锁和类锁区别
java的内置锁:每个java对象都可以用做一个实现同步的锁,这些锁成为内置锁.线程进入同步代码块或方法的时候会自动获得该锁,在退出同步代码块或方法时会释放该锁.获得内置锁的唯一途径就是进入这个锁的保 ...
- Java对象锁和类锁全面解析(多线程synchronized关键字)
最近工作有用到一些多线程的东西,之前吧,有用到synchronized同步块,不过是别人怎么用就跟着用,并没有搞清楚锁的概念.最近也是遇到一些问题,不搞清楚锁的概念,很容易碰壁,甚至有些时候自己连用没 ...
- java的对象锁和类锁
在java编程中,经常需要用到同步,而用得最多的也许是synchronized关键字了,下面看看这个关键字的用法. 因为synchronized关键字涉及到锁的概念,所以先来了解一些相关的锁知识. j ...
- 【Thread】java线程之对象锁、类锁、线程安全
说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...
- java线程同步以及对象锁和类锁解析(多线程synchronized关键字)
一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...
- java 对象锁和类锁的区别(转)
java 对象锁和类锁的区别 转自; ) ); ; ) ); 上述的代码,第一个方法时用了同步代码块的方式进行同步,传入的对象实例是this,表明是当前对象,当然,如果需要同步其他对象实例,也不可 ...
- Synchronized方法锁、对象锁、类锁区别
synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...
随机推荐
- 【LeetCode】371. Sum of Two Integers 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 位运算 日期 题目地址:https://leetco ...
- 【LeetCode】423. Reconstruct Original Digits from English 解题报告(Python)
[LeetCode]423. Reconstruct Original Digits from English 解题报告(Python) 标签: LeetCode 题目地址:https://leetc ...
- 1340 - Story of Tomisu Ghost
1340 - Story of Tomisu Ghost PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: ...
- Now冥想:崩溃服务和性能服务助力提升应用质量
想就像心灵的"健身房",当遇到失眠或情绪问题时,我们可以通过冥想,抚平情绪波澜,享受放松时刻.<Now冥想>正是一款专注冥想与心理健康的应用.它基于国际先进的正念冥想理 ...
- CS5266参数|Capstone CS5266|CS5266应用方案
随着目前手机.笔电和平板类产品都是用的Type-C接口,特别是苹果类的笔电和平板就只有一个Type-C接口,在很多工作.学习.娱乐中突显很多不方便的情况,别是需要一些其他的功能如:鼠标键盘接口USB2 ...
- 编写Java程序,使用JDialog构造登录窗体
返回本章节 返回作业目录 需求说明: 实现思路: 定义用户信息实体类User. 创建LoginDemoStart主类,初始化UI. 从UI获取用户信息并保存到User实体. 实现代码:
- Ranger-Kylin插件安装
Ranger-Kylin插件安装, 从Ranger1.1.0版本开始支持Ranger Kylin插件, 从Kylin2.3.0版本开始支持Ranger Kylin插件的权限控制. 1.获取安装包 sc ...
- 微服务探索之路01篇.net6.0项目本地win10系统docker到服务器liunx系统docker的贯通
本文介绍从创建 net6.0 项目运行在 windows 开发环境的 docker 然后正式部署至 liunx 服务器. 1 windows10 安装 docker 下载docker-desktop ...
- SpringBoot 之 Dao层模拟数据库操作
单表操作: # src/main/java/com/wu/dao/DepartmentDao .java @Repository public class DepartmentDao { privat ...
- 原型模式(python)
原型模式也叫克隆模式,通过拷贝自身的属性来创建一个新的对象,基本方法就是调用copy模块下的 (浅拷贝)copy() 和(深拷贝)deepcopy() #!/usr/bin/env python3 # ...