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 ...
随机推荐
- codeforc 603-A. Alternative Thinking(规律)
A. Alternative Thinking time limit per test 2 seconds memory limit per test 256 megabytes Kevin ha ...
- Amazing!!CSS 也能实现烟雾效果?
最近利用 CSS 实现了一些看似超出 CSS 能力的效果: 巧用渐变实现高级感拉满的背景光动画 Amazing!!CSS 也能实现极光? 本文继续此系列,本文主要想探讨一下,使用 CSS 能否比较好的 ...
- Java中PO、DO、DTO、 VO、 BO、POJO 、DAO、TO的概念
1. PO(persistant object) 持久对象 在 O/R 映射的时候出现的概念,如果没有 O/R 映射,没有这个概念存在了. 通常对应数据模型 ( 数据库 ), 本身还有部分业务逻辑的 ...
- 主流的 API 架构
1. RPC:调用另一个系统的函数 2. SOAP:使数据作为服务可用 3. REST:使数据作为资源可用 4. GraphQL:仅请求所需要的数据 1. RPC:调用另一个系统的函数 远程过程调用是 ...
- Least Angle Regression
目录 引 一些基本的假设 LARS算法 算法 与别的方法结合 LARS与LASSO的关系 LARS 与 Stagewise 代码 Efron B, Hastie T, Johnstone I M, e ...
- uniapp h5中解决跨域问题
"h5": { "title": "互联云玺", "template": "", "rou ...
- Java程序设计基础笔记 • 【第1章 初识Java】
全部章节 >>>> 本章目录 1.1 程序的概念及Java语言介绍 1.1.1 生活中的程序 1.1.2 计算机程序 1.1.3 算法和流程图 1.1.4 实践练习 1.2 ...
- 使用 JavaScript 的 HTML 页面混合、JavaScript 文件引用和 HTML 代码嵌入 3 种方式在 HTML 页面上打印出“点击我进入到百度首页”的超链接
查看本章节 查看作业目录 需求说明: 使用 JavaScript 的 HTML 页面混合.JavaScript 文件引用和 HTML 代码嵌入 3 种方式在 HTML 页面上打印出"点击我进 ...
- html基础 下拉菜单和文本域的基本操作
结构代码 所在城市: <select > <option selected>北京</option> <option>上海</option> ...
- 初识python: 继承
继承:可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展. 通过继承创建的新类称为"子类"或"派生类". 被继承的类称为"基 ...