概念

synchronized 是 Java 中的关键字,是利用锁的机制来实现同步的。

锁机制有如下两种特性:

  • 互斥性:即在同一时间只允许一个线程持有某个对象锁,通过这种特性来实现多线程中的协调机制,这样在同一时间只有一个线程对需同步的代码块(复合操作)进行访问。互斥性我们也往往称为操作的原子性。

  • 可见性:必须确保在锁被释放之前,对共享变量所做的修改,对于随后获得该锁的另一个线程是可见的(即在获得锁时应获得最新共享变量的值),否则另一个线程可能是在本地缓存的某个副本上继续操作从而引起不一致。

对象锁

synchronized修饰非静态方法时是对象锁,等同于synchronized(this),在同一个对象中是线程安全的。

package com.dwz.concurrency.chapter7;
/**
* 两个方法锁定的都是this即同一个对象thisLock,
* 同时调用的结果是一个执行完再执行下一个
*/
public class SynchronizedThis {
public static void main(String[] args) {
ThisLock thisLock = new ThisLock();
new Thread("T1") {
@Override
public void run() {
thisLock.m1();
}
}.start(); new Thread("T2") {
@Override
public void run() {
thisLock.m2();
}
}.start();
}
} class ThisLock {
  public synchronized void m1() {
try {
System.out.println(Thread.currentThread());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public synchronized void m2() {
try {
System.out.println(Thread.currentThread());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

执行结果:m1和m2先后执行

package com.dwz.concurrency.chapter7;
/**
* 锁定的是两个不同的对象,没有起到锁的作用,还是多线程执行
*/
public class SynchronizedThis2 {
public static void main(String[] args) {
ThisLock2 thisLock = new ThisLock2();
new Thread("T1") {
@Override
public void run() {
thisLock.m1();
}
}.start(); new Thread("T2") {
@Override
public void run() {
thisLock.m2();
}
}.start();
}
} class ThisLock2 {
private final Object LOCK = new Object(); public void m2() {
synchronized (LOCK) {
try {
System.out.println(Thread.currentThread());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} public void m1() {
synchronized (this) {
try {
System.out.println(Thread.currentThread());
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

执行结果:m1和m2同时执行

类锁

synchronized修饰静态方法时是类锁,等同于synchronized(类.class),是线程安全的。

package com.dwz.concurrency.chapter7;

public class SynchronizedStatic {
public synchronized static void m1() {
System.out.println("m1" + Thread.currentThread());
try {
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public synchronized static void m2() {
System.out.println("m2" + Thread.currentThread());
try {
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} public synchronized static void m3() {
System.out.println("m3" + Thread.currentThread());
try {
Thread.sleep(10_000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

测试类

package com.dwz.concurrency.chapter7;

public class SynchronizedTest2 {
public static void main(String[] args) {
new Thread("T1") {
@Override
public void run() {
SynchronizedStatic.m1();
};
}.start(); new Thread("T2") {
@Override
public void run() {
SynchronizedStatic.m2();
};
}.start(); new Thread("T3") {
@Override
public void run() {
SynchronizedStatic.m3();
};
}.start();
}
}

执行结果:T1 T2 T3是先后执行的

总结

1、对于静态方法,由于此时对象还未生成,所以只能采用类锁;

2、只要采用类锁,就会拦截所有线程,只能让一个线程访问。

3、对于对象锁(this),如果是同一个实例,就会按顺序访问,但是如果是不同实例,就可以同时访问。

4、如果对象锁跟访问的对象没有关系,那么就会都同时访问。

synchronized的对象锁和类锁的更多相关文章

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

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

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

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

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

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

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

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

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

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

  6. Java 中对象锁和类锁的区别? 关键字 Synchronized的用法?

    一  对象锁和类锁的关系 /* * 对象锁和[类锁] 全局锁的关系? 对象锁是用于对象实例方法,或者一个对象实例上的 this 类锁是用于类的静态方法或者一个类的class对象上的. Ag.class ...

  7. java的对象锁和类锁

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

  8. java的synchronized有没有同步的类锁?

    转自:http://langgufu.iteye.com/blog/2152608 http://www.cnblogs.com/beiyetengqing/p/6213437.html 没有... ...

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

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

随机推荐

  1. python 定时爬取内容并发送报告到指定邮箱

    import requests import smtplib import schedule import time from bs4 import BeautifulSoup from email. ...

  2. Linux 创建用户 用户组 用户权限

    首先 你要有个root账号 然后才能做下面几条操作: useradd username 创建用户usernamepasswd user_pwd     给已创建的用户username设置密码 关于us ...

  3. mydql 函数和存储过程

    存储过程 CREATE PROCEDURE getUid (IN phone CHAR(11), OUT uid INT ) READS SQL DATA BEGIN select u.id from ...

  4. 使用jMeter构造大量并发HTTP请求进行微服务性能测试

    比如我开发好了一个微服务,想测试其在大并发请求下的性能表现如何. 比较方便的一个做法是使用工具jMeter来构造这些请求. 创建一个新的工程: 创建一个新的Thread Group,下图意思是这个工程 ...

  5. C#面向对象(抽象类、接口、构造函数、重载、静态方法和静态成员)

    1.抽象类    抽象类关键词   abstract   (抽象)  override    (重写) 在父集中用   abstract 表示抽象类,抽象方法,在子集中用  override 改写 抽 ...

  6. VUE【一、概述】

    早上写的忘了保存..还有很多唠叨的内容...哎又得重新写一遍..想吐槽那个自动保存有卵用.. 今天周一,早上起来继续 由于周六加了一整天班,导致周日无心学习,一天都在玩游戏看电影,到了晚上反而更加空虚 ...

  7. Python学习记录6-list、tuple、dict、set复习

    数据类型在一门语言中是非常重要的,所以选择再次学习一下加深记忆.本次主要参考了大神廖雪峰的官方网站,非常感谢大神,讲的很清晰,收获很大. 标准数据类型 Number(数字) String(字符串) L ...

  8. Win10系统升级更新方式将会更智能

    使用Win10系统的你肯定遇到过在工作时开始自动更新而不得不搁置工作的情况,想必你也已经被Win10系统的自动更新折磨不已,不过这种情况将会马上得到改观. 微软现在已经开始寻找更智能的版本升级更新方式 ...

  9. 十:Razor语法

    1.Razor简介 不是一种代码语言,而是视图中使用的代码引擎. 它以简洁的类似客户端的语法结构,呈现网页服务端代码功能 它替代了ASPX页面的“<%...%>”代码块语法. 在编写时使用 ...

  10. idou老师教你学istio1:如何为服务提供安全防护能力

    之前,已为大家介绍过 Istio 第一主打功能---连接服务. 凡是产生连接关系,就必定带来安全问题,人类社会如此,服务网格世界,亦是如此. 今天,我们就来谈谈Istio第二主打功能---保护服务. ...