一  对象锁和类锁的关系

/*
*
对象锁和【类锁】 全局锁的关系?
对象锁是用于对象实例方法,或者一个对象实例上的 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. 1479 小Y的数论题

    小Y喜欢研究数论,并且喜欢提一些奇怪的问题.这天他找了三个两两互质的数a, b, c,以及另一个数m, 现在他希望找到三个(0, m)范围内的整数x, y, z,使得 (xa+yb) Mod m=(z ...

  2. [算法笔记-题解]问题 D: 习题4-4 三个整数求最大值

    问题 D: 习题4-4 三个整数求最大值 [命题人 : 外部导入] 时间限制 : 1.000 sec 内存限制 : 12 MB 题目描述 有3个整数a, b, c,由键盘输入,输出其中最大的数. 输入 ...

  3. 关于 base64 编码

    一.什么是Base64编码 Base64是一种用64个字符来表示任意二进制数据的方法.它是一种编码方式,而非加密方式.它通过将二进制数据转变为64个"可打印字符",完成了数据在HT ...

  4. Java程序设计基础笔记 • 【第1章 初识Java】

    全部章节   >>>> 本章目录 1.1 程序的概念及Java语言介绍 1.1.1 生活中的程序 1.1.2 计算机程序 1.1.3 算法和流程图 1.1.4 实践练习 1.2 ...

  5. localstorage的浏览器支持情况

    localStorage的兼容性不错,就国内的情况,已经基本没有问题了.localStorage的原理很简单,浏览器为每个域名划出一块本地存储空间,用户网页可以通过localStorage命名空间进行 ...

  6. Storm集群使用DRPC功能Version1.0.1

    在Storm集群上开启DRPC功能, 基于Storm的1.0.1版本, 并且执行简单的例子测试. 1.DRPC概念 DRPC就是分布式远程过程调用. Storm里面引入DRPC主要是利用storm的实 ...

  7. Hadoop编译打包记录

    Hadoop编译打包,基于2.7.2版本的源码. # 打包过程中需要使用到的工具 java -version mvn -version ant -version type protoc type cm ...

  8. python使用String的Template进行参数动态替换

    1.前言: 之前使用string的find(),从指定的param里面查找,是否包含了某个字符,有的话,使用replace进行替换,一个接口的param要替换的参数少的话,使用这种方式,的确可行,如果 ...

  9. ES6解构与默认值的结合使用

    在读源码框架时遇到方法中有这样的形参:{ message = 'ok' } = {} 有点懵为什么已经赋值了还又赋了一个空对象 随后我去看了阮一峰老师的 ECMAScript 6 入门才明白.这是参数 ...

  10. Redis_客户端命令和数据操作(3)

    更多命令请查找:http://c.biancheng.net/redis_command/ 切换数据库 redis数据库没有名称,默认有16个,通过0-15来标识,连接redis默认选择第一个数据库, ...