本文不会特别深入细致地讨论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();
}
}

问题答案

先直接报上答案:

  1. 一直输出“Thread-1”
  2. 一直输出“Thread-1”
  3. 交替输出“Thread-1”和“Thread-2”
  4. 交替输出“Thread-1”和“Thread-2”

问题本质分析

不废话,直接点出,这四个问题只要明白两件事即可:

  • 一个线程是否能执行被同步了的方法,主要看是否能拿到锁对象
  • 静态方法的同步锁是类对象本身,非静态方法的同步锁是实例对象本身,同步代码块的同步锁是括号中传入的对象

所以

  • 如果两个线程执行方法用到了同一个锁对象,则一个线程执行时,另一个线程必须等待其释放锁才能拿到锁,所以此时两个线程会互斥

所以

  • 1中两个线程执行方法的锁对象都是类对象A,所以线程之间互斥
  • 2中两个线程执行方法的锁对象都是实例对象a,所以线程之间互斥
  • 3中两个线程执行方法的锁对象分别是new出来的两个实例对象a,所以线程互不影响
  • 4中两个线程执行方法的锁对象分别是new出来的两个实例对象object,所以线程互不影响

Game Over

聊聊synchronized的锁问题的更多相关文章

  1. Java多线程之synchronized线程锁

    package org.study2.javabase.ThreadsDemo.sync; /** * @Auther:GongXingRui * @Date:2018/9/18 * @Descrip ...

  2. [多线程] 线程中的synchronized关键字锁

    为什么要用锁? 在多线程中,难免会出现在多个线程中对同一个对象的实例变量或者全局静态变量进行并发访问的情况,如果不做正确的同步处理,那么产生的后果就是"脏读",也就是取到的数据其实 ...

  3. synchronized、锁、多线程同步的原理是咋样

    先综述个结论: 一般说的synchronized用来做多线程同步功能,其实synchronized只是提供多线程互斥,而对象的wait()和notify()方法才提供线程的同步功能. 一般说synch ...

  4. 【转载】Java中的锁机制 synchronized & 偏向锁 & 轻量级锁 & 重量级锁 & 各自优缺点及场景 & AtomicReference

    参考文章: http://blog.csdn.net/chen77716/article/details/6618779 目前在Java中存在两种锁机制:synchronized和Lock,Lock接 ...

  5. java synchronized究竟锁住的是什么

    刚学java的时候,仅仅知道synchronized一个线程锁.能够锁住代码,可是它真的能像我想的那样,能够锁住代码吗? 在讨论之前先看一下项目中常见关于synchronized的使用方法: publ ...

  6. synchronized到底锁住的是谁?

    本文代码仓库:https://github.com/yu-linfeng/BlogRepositories/tree/master/repositories/sync 先来一道校招级并发编程笔试题 题 ...

  7. synchronized和锁(ReentrantLock) 区别

    synchronized和锁(ReentrantLock) 区别 java的两种同步方式, Synchronized与ReentrantLock的区别 并发(一):理解可重入锁 可重入锁和不可重入锁 ...

  8. synchronized互斥锁实例解析

    目录 synchronized互斥锁实例解析 1.互斥锁基础使用:防止多个线程同时访问对象的synchronized方法. 1.1.多个线程调用同一个方法 1.2.多个线程多个锁,升级为类锁 2.线程 ...

  9. synchronized的锁是针对多线程的

    synchronized的锁是针对多线程的,从线程的角度去思考才能真正弄明白. Java的synchronized使用方法总结 1. 把synchronized当作函数修饰符时 这也就是同步方法,那这 ...

随机推荐

  1. flask 扩展之 -- flask-mail

    Flask-Mail 封装了 python 标准库 smtplib 包, 以便于更好的与 Flask 集成. 一. 安装 $ pip install flask-mail 二. 配置 及 初始化 Fl ...

  2. war包中少了class文件

    用eclipse的maven工具打包(执行mvn clean install  和   mvn package)后,再启动wildfly, war包应该会自动复制到wildfly的deployment ...

  3. 搭建es6开发与非开发环境babel-browser

    前言 最近打算把es6应用到项目中,但是如何在开发环境(浏览器端)直接运行es6?es6已经发布一段时间了,现在大部分是在node.js环境运行,或者通过babel编译之后运行.babel-brows ...

  4. Openfire4源码部署到eclipse中并编译

    Openfire4源码部署到eclipse中并编译 概述 Openfire是众所周知的基于xmpp协议的IM开源服务,所有操作,配置,监控,调试等以B/S方式进行展示,非常的方便管理员进行管理.它的强 ...

  5. CSS自适应的占位符效果

    一种不错的自适应input效果,分享一下.html section : <div style="width:500px;height:500px;margin:300px auto;b ...

  6. Java 中基本类型和字符串之间的转换

    Java 中基本类型和字符串之间的转换 在程序开发中,我们经常需要在基本数据类型和字符串之间进行转换. 其中,基本类型转换为字符串有三种方法: 1. 使用包装类的 toString() 方法 2. 使 ...

  7. 【原】无脑操作:Windows 10 + MySQL 5.5 安装使用及免安装使用

    本文介绍Windows 10环境下, MySQL 5.5的安装使用及免安装使用 资源下载: MySQL安装文件:http://download.csdn.net/detail/lf19820717/9 ...

  8. JQuery中常用的选择器

    属性选择器 1>  [attribute] 概述:匹配包含给定属性的元素. 示例 jQuery 代码:$("div[id]") 描述:查找所有含有 id 属性的 div 元素 ...

  9. HTML form表单小结

    HTML form标签小结 最近研究 form标签,有一些小心得写下来与大家分享分享,共勉.在小结的最后有一个form表单的小例子,可以作为参考. -----DanlV form是HTML的一个极为重 ...

  10. C/C++中对链表操作的理解&&实例分析

    链表概述 链表是一种常见的重要的数据结构.它是动态地进行存储分配的一种结构.它可以根据需要开辟内存单元.链表有一个“头指针”变量,以head表示,它存放一个地址.该地址指向一个元素.链表中每一个元素称 ...