有一个类A,提供了三个方法。分别是静态同步方法,非静态同步方法,含有静态代码块的方法

 1 class A{
2 public static synchronized void print1(){
3 print();
4 }
5 public synchronized void print2(){
6 print();
7 }
8 public void print3(){
9 synchronized (new Object()){
10 print();
11 }
12 }
13 private static void print(){
14 while(true){
15 String threadName = Thread.currentThread().getName();
16 System.out.println(threadName);
17 }
18 }
19 }

请回答一下四种情况的输出结果

 1 class Test {
2 // 1.两个线程,同一个类,调用静态同步方法print1
3 @Test
4 public void test1() {
5 Thread thread1 = new Thread(() -> A.print1());
6 Thread thread2 = new Thread(() -> A.print1());
7 thread1.start();
8 thread2.start();
9 }
10 // 2.两个线程,同一个对象,调用非静态同步方法print2
11 @Test
12 public void test2() {
13 A a = new A();
14 Thread thread1 = new Thread(() -> a.print2());
15 Thread thread2 = new Thread(() -> a.print2());
16 thread1.start();
17 thread2.start();
18 }
19 // 3.两个线程,不同对象,调用非静态同步方法print2
20 @Test
21 public void test3() {
22 Thread thread1 = new Thread(() -> new A().print2());
23 Thread thread2 = new Thread(() -> new A().print2());
24 thread1.start();
25 thread2.start();
26 }
27 // 4.两个线程,同一个对象,调用普通非静态方法(带有同步代码块)print3
28 @Test
29 public void test4() {
30 A a = new A();
31 Thread thread1 = new Thread(() -> a.print3());
32 Thread thread2 = new Thread(() -> a.print3());
33 thread1.start();
34 thread2.start();
35 }
36 }

问题答案

先直接报上答案:

  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当作函数修饰符时 这也就是同步方法,那这 ...

  10. synchronized的锁升级/锁膨胀

    偏向锁 偏向第一个拿到锁的线程. 即第一个拿到锁的线程,锁会在对象头 Mark Word 中通过 CAS 记录该线程 ID,该线程以后每次拿锁时都不需要进行 CAS(指轻量级锁). 如果该线程正在执行 ...

随机推荐

  1. setting-mirrorO以及下载jar包流程简介

    mirrorOf常见的几种配置如下 1.* 2.repo3 3.repo1,repo2,*,!repo3 4.external:* 第二个例子只配置了一个repo3,这个镜像只能匹配id是repo3的 ...

  2. GDB查看内存(x 命令)

    gdb查看内存命令 首先使用gdb [YourFileName].c进入gdb界面 使用examine命令,字母缩写为x查看内存地址的值.x命令语法 x/[number][format] <ad ...

  3. JavaScript “跑马灯”抽奖活动代码解析与优化(一)

    最近的项目中做了一个"跑马灯"的抽奖特效插件.上篇文章已经分享过html和css 的相关知识.这篇文章主要分享一些 JavaScript 相关的知识.这几天在写这篇文章的时候,也顺 ...

  4. Hibernate框架 主配置文件(Hibernate.cfg.xml)基本

    数据库连接参数配置: <?xml version='1.0' encoding='UTF-8'?> <!--表明解析本XML文件的DTD文档位置,DTD是Document Type ...

  5. 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

    如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案

  6. Java对日期Date类进行日期加减运算,年份加减,月份加减

    package com.cy; import java.security.InvalidParameterException; import java.text.ParseException; imp ...

  7. JavaWeb学习(二十九)———— 事务

    一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句  update from account set mone ...

  8. 【hihoCoder】#1133 : 二分·二分查找之k小数

    题目描述 在上一回里我们知道Nettle在玩<艦これ>,Nettle的镇守府有很多船位,但船位再多也是有限的.Nettle通过捞船又出了一艘稀有的船,但是已有的N(1≤N≤1,000,00 ...

  9. Hyperledger Fabric密码模块系列之BCCSP(五) - 国密算法实现

    Talk is cheap, show me your code. 代码也看了,蛋也扯了,之后总该做点什么.响应国家政策,把我们的国密算法融合进去吧--  先附两张bccsp下国密算法的设计实现图. ...

  10. MongoDB设计系列

    原创文章,如果转载请标明出处.作者. https://www.cnblogs.com/alunchen/p/9762233.html 1 前言 MongoDB作为现今流行的非关系型文档数据库,已经有很 ...