聊聊synchronized的锁问题
本文不会特别深入细致地讨论synchronized,只是做一个通俗易懂的说明,以及看清一类问题的本质,希望能给大家一点启发。
问题描述
有一个类A,提供了三个方法。分别是静态同步方法,非静态同步方法,含有静态代码块的方法
class A{
public static synchronized void print1(){
print();
}
public synchronized void print2(){
print();
}
public void print3(){
synchronized (new Object()){
print();
}
}
private static void print(){
while(true){
String threadName = Thread.currentThread().getName();
System.out.println(threadName);
}
}
}
请回答一下四种情况的输出结果
class Test {
// 1.两个线程,同一个类,调用静态同步方法print1
@Test
public void test1() {
Thread thread1 = new Thread(() -> A.print1());
Thread thread2 = new Thread(() -> A.print1());
thread1.start();
thread2.start();
}
// 2.两个线程,同一个对象,调用非静态同步方法print2
@Test
public void test2() {
A a = new A();
Thread thread1 = new Thread(() -> a.print2());
Thread thread2 = new Thread(() -> a.print2());
thread1.start();
thread2.start();
}
// 3.两个线程,不同对象,调用非静态同步方法print2
@Test
public void test3() {
Thread thread1 = new Thread(() -> new A().print2());
Thread thread2 = new Thread(() -> new A().print2());
thread1.start();
thread2.start();
}
// 4.两个线程,同一个对象,调用普通非静态方法(带有同步代码块)print3
@Test
public void test4() {
A a = new A();
Thread thread1 = new Thread(() -> a.print3());
Thread thread2 = new Thread(() -> a.print3());
thread1.start();
thread2.start();
}
}
问题答案
先直接报上答案:
- 一直输出“Thread-1”
- 一直输出“Thread-1”
- 交替输出“Thread-1”和“Thread-2”
- 交替输出“Thread-1”和“Thread-2”
问题本质分析
不废话,直接点出,这四个问题只要明白两件事即可:
- 一个线程是否能执行被同步了的方法,主要看是否能拿到锁对象
- 静态方法的同步锁是类对象本身,非静态方法的同步锁是实例对象本身,同步代码块的同步锁是括号中传入的对象
所以
- 如果两个线程执行方法用到了同一个锁对象,则一个线程执行时,另一个线程必须等待其释放锁才能拿到锁,所以此时两个线程会互斥
所以
- 1中两个线程执行方法的锁对象都是类对象A,所以线程之间互斥
- 2中两个线程执行方法的锁对象都是实例对象a,所以线程之间互斥
- 3中两个线程执行方法的锁对象分别是new出来的两个实例对象a,所以线程互不影响
- 4中两个线程执行方法的锁对象分别是new出来的两个实例对象object,所以线程互不影响
Game Over
聊聊synchronized的锁问题的更多相关文章
- Java多线程之synchronized线程锁
package org.study2.javabase.ThreadsDemo.sync; /** * @Auther:GongXingRui * @Date:2018/9/18 * @Descrip ...
- [多线程] 线程中的synchronized关键字锁
为什么要用锁? 在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实 ...
- synchronized、锁、多线程同步的原理是咋样
先综述个结论: 一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能. 一般说synch ...
- 【转载】Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景 & AtomicReference
参考文章: http://blog.csdn.net/chen77716/article/details/6618779 目前在Java中存在两种锁机制:synchronized和Lock,Lock接 ...
- java synchronized究竟锁住的是什么
刚学java的时候,仅仅知道synchronized一个线程锁.能够锁住代码,可是它真的能像我想的那样,能够锁住代码吗? 在讨论之前先看一下项目中常见关于synchronized的使用方法: publ ...
- synchronized到底锁住的是谁?
本文代码仓库:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sync 先来一道校招级并发编程笔试题 题 ...
- synchronized和锁(ReentrantLock) 区别
synchronized和锁(ReentrantLock) 区别 java的两种同步方式, Synchronized与ReentrantLock的区别 并发(一):理解可重入锁 可重入锁和不可重入锁 ...
- synchronized互斥锁实例解析
目录 synchronized互斥锁实例解析 1.互斥锁基础使用:防止多个线程同时访问对象的synchronized方法. 1.1.多个线程调用同一个方法 1.2.多个线程多个锁,升级为类锁 2.线程 ...
- synchronized的锁是针对多线程的
synchronized的锁是针对多线程的,从线程的角度去思考才能真正弄明白. Java的synchronized使用方法总结 1. 把synchronized当作函数修饰符时 这也就是同步方法,那这 ...
随机推荐
- Here文档
Here文档为需要输入的程序,例如,mail.sort和cat等接收在线文本,直到遇到用户定义的结束符号为止.最常用的用户是在Shell脚本中和case命令一起创建菜单.自动登录等等. 1.建立菜单 ...
- VSTO在幻灯片里面添加按钮对象
//添加Form窗体,窗体中添加Image控件,单击弹出"PPT"信息提示 //命名引用:using MF = Microsoft.Vbe.Interop.Forms; priva ...
- 小试牛刀JavaScript鼠标事件
鼠标事件练习1 当鼠标点击网页某个单元格的时候,其他的单元格颜色不变,只有被点击的单元格颜色发生变化 <style type="text/css"> *{ margin ...
- R语言包翻译
Shiny-cheatsheet 作者:周彦通 1.安装 install.packages("shinydashboard") 2.基础知识 仪表盘有三个部分:标题.侧边栏,身体 ...
- 我的学习之路_第二十章_JDBC
JDBC 使用JDBC技术,通过mysql提供的驱动程序,操作数据库 ● 1. 注册驱动 告知jvm 使用的是什么驱动程序(mysql,oracle) 使用API中的类 DriverManager中的 ...
- eclipse 和 jdk的位数不同
如果eclipse 和 jdk的位数不同,如一个64Bit一个32位,不需要修改环境变量,只需要在eclipse根目录的eclipse.ini文件中第一行加入:-vmD:\Program Files\ ...
- jQuery实现的快速查找
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- 使用Homebrew配置Java开发环境
查询java brew cask search java 查看版本信息 brew cask info java 从官网下载并安装 JDK 8 brew cask install java 需要安装 J ...
- Vijos 1111 小胖的水果 LCS
描述 xuzhenyi到大同水果店去买水果,但老板huyichen告诉他每次只能买一种,但是xuzhenyi想吃两种,于是在讨价还价之后,huyichen说只要xuzhenyi能把他想要的两种水果合并 ...
- ionicangular 成长日记
//首先配置文件ionic.bundle.min.jsionic.min.css" //创建一个angular控制器,控制器给body/html都可以angular.module('myap ...