一  对象锁和类锁的关系

/*
*
对象锁和【类锁】 全局锁的关系?
对象锁是用于对象实例方法,或者一个对象实例上的 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】778. Swim in Rising Water 水位上升的泳池中游泳(Python)

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

  2. 【LeetCode】748. Shortest Completing Word 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 日期 题目地址:https://leetcode.c ...

  3. 【LeetCode】703. Kth Largest Element in a Stream 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 小根堆 日期 题目地址:https://leetco ...

  4. 「算法笔记」Polya 定理

    一.前置概念 接下来的这些定义摘自 置换群 - OI Wiki. 1. 群 若集合 \(s\neq \varnothing\) 和 \(S\) 上的运算 \(\cdot\) 构成的代数结构 \((S, ...

  5. Java Springboot webSocket简单实现,调接口推送消息到客户端socket

    Java Springboot webSocket简单实现,调接口推送消息到客户端socket 后台一般作为webSocket服务器,前台作为client.真实场景可能是后台程序在运行时(满足一定条件 ...

  6. Pytest_简介与安装(1)

    一.Pytest简介 pytest是python的一种单元测试框架,与python自带的unittest测试框架类似,但更灵活.官方网站优点简介: 非常容易上手,入门简单,文档丰富,文档中有很多实例可 ...

  7. Gitlab如何进行备份恢复与迁移?

    https://blog.csdn.net/ouyang_peng/article/details/77070977 1.Gitlab 创建备份 1.1 创建备份文件 首先我们得把老服务器上的Gitl ...

  8. Shell 中的 expect 命令

    目录 expect 介绍 expect 安装 expect 语法 自动拷贝文件到远程主机 示例一 示例二 示例三 示例四 expect 介绍 借助 expect 处理交互的命令,可以将交互过程如 ss ...

  9. 【PowerShell】ASCII与Char之间的转换

    1 [char[]][int[]]$char=65..90 2 $char -join ',' 3 [int[]][char[]]$ascii=$char 4 $ascii -join ',' A,B ...

  10. 简单的sdn防火墙

    github仓库 演示视频 本次实验建立的拓扑 使用到的 pox 指令介绍,参考pox控制器学习笔记 1. forwarding.l2_learning 使OpenFlow交换机充当L2学习交换机的一 ...