一  对象锁和类锁的关系

/*
*
对象锁和【类锁】 全局锁的关系?
对象锁是用于对象实例方法,或者一个对象实例上的 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的用法?的更多相关文章

  1. 理解Java中对象基础Object类

    一.Object简述 源码注释:Object类是所有类层级关系的Root节点,作为所有类的超类,包括数组也实现了该类的方法,注意这里说的很明确,指类层面. 所以在Java中有一句常说的话,一切皆对象, ...

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

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

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

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

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

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

  5. java的对象锁和类锁

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

  6. 【Thread】java线程之对象锁、类锁、线程安全

    说明: 1.个人技术也不咋滴.也没在项目中写过线程,以下全是根据自己的理解写的.所以,仅供参考及希望指出不同的观点. 2.其实想把代码的github贴出来,但还是推荐在初学的您多亲自写一下,就没贴出来 ...

  7. java线程同步以及对象锁和类锁解析(多线程synchronized关键字)

    一.关于线程安全 1.是什么决定的线程安全问题? 线程安全问题基本是由全局变量及静态变量引起的. 若每个线程中对全局变量.静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的:若有多个线 ...

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

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

  9. Synchronized方法锁、对象锁、类锁区别

    synchronized,这个东西我们一般称之为”同步锁“,他在修饰代码块的时候需要传入一个引用对象作为“锁”的对象. 在修饰方法的时候,默认是当前对象作为锁的对象 在修饰类时,默认是当前类的Clas ...

随机推荐

  1. 【LeetCode】794. Valid Tic-Tac-Toe State 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/valid-ti ...

  2. 【剑指Offer】按之字形顺序打印二叉树 解题报告(Python)

    [剑指Offer]按之字形顺序打印二叉树 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-intervie ...

  3. UVA11754 - Code Feat

    Hooray!  Agent Bauer has shot the terrorists, blown upthe bad guy base, saved the hostages, exposed ...

  4. [opencv]白平衡算法中的灰度世界法,改善图像发红发蓝发绿的现象

    #include<iostream> #include <opencv2/opencv.hpp> #include <math.h> using namespace ...

  5. Java 中 this 和 super 的用法及案例

    this this 是自身的一个对象,代表对象本身,可以理解为:指向对象本身的一个指针. this 的用法在 Java 中大体可以分为3种: 1.普通的直接引用 这种就不用讲了,this 相当于是指向 ...

  6. 使用 Eclipse 可视化插件 windowbuilder 进行Java GUI开发(插件安装的两种方法)

    对于Java GUI开发 其实最方便的方法是用插件制作,当然先了解完代码原理是最好的. eclispe安装windowbuilder有两种方式,一种是离线安装,一种是在线安装. 一.第一种在线安装: ...

  7. Centos8 设置中文

    1.一般情况 1.1 进入设置选择 Region&Language 1.2 点击 加号 1.3 点击 汉语(中国) 1.4 选择 汉语(智能拼音) 2.特殊情况 有些虚拟机可能没有 汉语(智能 ...

  8. 1.spring系列之优雅的实现接口统一返回

    好处 现在公司开发基本上都是以前后分离模式为主,所以要有个统一的数据格式,这样有什么好处呢? 能够提高前后端对接的效率(特别重要) 代码更加优雅和简洁 对于前端和后端维护更方便容易 实现(直接上代码) ...

  9. 解决eclipse中Findbugs检查不生效的问题

    eclipse安装了Findbugs插件, 但是在eclipse中发现不了bug错误, 具体表现为指定的类存在findbugs, 已经通过其他工具检查出来, 但是在eclipse中就是无法报告错误. ...

  10. hisql 新一代无实体ORM使用第一步 hisql安装使用

    安装 github hisql 最新源码下载 也可以通过nuget安装 注意:HiSql仅支持.net5或以上环境 选择您需要支持的数据库对应的支持包进行安装 本例使用sqlserver进行演示,请安 ...