题目:

判断以下8种情况,输出的内容

题目一:一个Number实例对象number,两个非静态同步方法getOne,getTwo,两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo),判断输出

package com.dx.juc.test;

public class Thread8Monitor {
public static void main(String[] args) {
final Number number=new Number(); new Thread(new Runnable() {
public void run() {
number.getOne();
}
}).start(); new Thread(new Runnable() {
public void run() {
number.getTwo();
}
}).start();
}
} class Number{
public synchronized void getOne(){
System.out.println("one");
} public synchronized void getTwo(){
System.out.println("two");
}
}

输出结果:

one
two

题目二:一个Number实例对象number,两个非静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo),判断输出

package com.dx.juc.test;

public class Thread8Monitor {
public static void main(String[] args) {
final Number number=new Number(); new Thread(new Runnable() {
public void run() {
number.getOne();
}
}).start(); new Thread(new Runnable() {
public void run() {
number.getTwo();
}
}).start();
}
} class Number{
public synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
} public synchronized void getTwo(){
System.out.println("two");
}
}

输出结果:

one
two

题目三:一个Number实例对象number,两个非静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),新增普通方法getThree方法,三个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo,一个线程调用number.getThree),判断输出

package com.dx.juc.test;

public class Thread8Monitor {
public static void main(String[] args) {
final Number number=new Number(); new Thread(new Runnable() {
public void run() {
number.getOne();
}
}).start(); new Thread(new Runnable() {
public void run() {
number.getTwo();
}
}).start(); new Thread(new Runnable() {
public void run() {
number.getThree();
}
}).start();
}
} class Number{
public synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
} public synchronized void getTwo(){
System.out.println("two");
}
public void getThree(){
System.out.println("three");
}
}

输出结果:

three
one
two

题目四:两个Number实例对象number,number2,两个非静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number2.getTwo),判断输出

package com.dx.juc.test;

public class Thread8Monitor {
public static void main(String[] args) {
final Number number=new Number();
final Number number2=new Number(); new Thread(new Runnable() {
public void run() {
number.getOne();
}
}).start(); new Thread(new Runnable() {
public void run() {
// number.getTwo();
number2.getTwo();
}
}).start();
}
} class Number{
public synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
} public synchronized void getTwo(){
System.out.println("two");
}
}

输出结果:

two
one

题目五:一个Number实例对象number,一个静态同步方法getOne,一个非静态同步方法getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo),判断输出

package com.dx.juc.test;

public class Thread8Monitor {
public static void main(String[] args) {
final Number number=new Number();new Thread(new Runnable() {
public void run() {
number.getOne();
}
}).start(); new Thread(new Runnable() {
public void run() {
number.getTwo();
}
}).start();
}
} class Number{
public static synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
} public synchronized void getTwo(){
System.out.println("two");
}
}

输出结果:

two
one

题目六:一个Number实例对象number,两个静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.getTwo),判断输出

package com.dx.juc.test;

public class Thread8Monitor {
public static void main(String[] args) {
final Number number=new Number();
//final Number number2=new Number(); new Thread(new Runnable() {
public void run() {
number.getOne();
}
}).start(); new Thread(new Runnable() {
public void run() {
number.getTwo();
// number2.getTwo();
}
}).start();
}
} class Number{
public static synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
} public static synchronized void getTwo(){
System.out.println("two");
}
}

输出结果:

one
two

题目七:两个Number实例对象number,number2,一个静态同步方法getOne,一个非静态同步方法getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.2getTwo),判断输出

package com.dx.juc.test;

public class Thread8Monitor {
public static void main(String[] args) {
final Number number=new Number();
final Number number2=new Number(); new Thread(new Runnable() {
public void run() {
number.getOne();
}
}).start(); new Thread(new Runnable() {
public void run() {
// number.getTwo();
number2.getTwo();
}
}).start();
}
} class Number{
public static synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
} public synchronized void getTwo(){
System.out.println("two");
}
}

输出结果:

two
one

题目八:两个Number实例对象number,number2,两个静态同步方法getOne,getTwo,给getOne添加Thread.sleep(3000),两个线程打印输出(一个线程调用number.getOne,另外一个线程调用number.2getTwo),判断输出

package com.dx.juc.test;

public class Thread8Monitor {
public static void main(String[] args) {
final Number number=new Number();
final Number number2=new Number(); new Thread(new Runnable() {
public void run() {
number.getOne();
}
}).start(); new Thread(new Runnable() {
public void run() {
// number.getTwo();
number2.getTwo();
}
}).start();
}
} class Number{
public static synchronized void getOne(){
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("one");
} public static synchronized void getTwo(){
System.out.println("two");
}
}

输出结果:

one
two

总结:

1)静态方法锁是锁的Number.class(类的字节码,也是Class的实例);一个类中不管有多少个静态方法,不管访问它们的是多少个线程,这些线程都是公用同一个锁。

2)非静态方法锁是锁的this,也就是当前实例对象。this就是指当前类的实例对象,同一个实例对象通用一个锁,不同实例对象使用不用锁。

Java-JUC(十一):线程8锁的更多相关文章

  1. JAVA语言规范-线程和锁章节之同步、等待和通知

    JAVA语言规范:线程和锁 1 同步 java编程语言提供了线程间通信的多种机制.这些方法中最基本的是同步化,此方法是使用监视器实现的.JAVA中每个对象与一个监视器相关联,一个线程可以加锁和解锁监视 ...

  2. JAVA多线程学习十一-线程锁技术

    前面我们讲到了synchronized:那么这节就来将lock的功效. 一.locks相关类 锁相关的类都在包java.util.concurrent.locks下,有以下类和接口: |---Abst ...

  3. Java - "JUC" ReentrantLock获取锁

    [Java并发编程实战]-----“J.U.C”:ReentrantLock之一简介 ReentrantLock介绍 ReentrantLock是一个可重入的互斥锁,又被称为“独占锁”. 顾名思义,R ...

  4. Java - "JUC" ReentrantLock释放锁

    Java多线程系列--“JUC锁”04之 公平锁(二) 释放公平锁(基于JDK1.7.0_40) 1. unlock() unlock()在ReentrantLock.java中实现的,源码如下: p ...

  5. JUC——线程同步锁(锁处理机制简介)

    锁处理机制简介 juc的开发框架解决的核心问题是并发访问和数据安全操作问题,当进行并发访问的时候如果对于锁的控制不当,就会造成死锁这样的阻塞问题. 为了解决这样的缺陷,juc里面重新针对于锁的概念进行 ...

  6. java高并发系列 - 第12天JUC:ReentrantLock重入锁

    java高并发系列 - 第12天JUC:ReentrantLock重入锁 本篇文章开始将juc中常用的一些类,估计会有十来篇. synchronized的局限性 synchronized是java内置 ...

  7. java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)

    一.Condition 类 在前面我们学习与synchronized锁配合的线程等待(Object.wait)与线程通知(Object.notify),那么对于JDK1.5 的 java.util.c ...

  8. Java线程:锁

    一.锁的原理 Java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行的代码类的当前实例(this实例)有关的锁.获得一个对象的锁也称为获取锁.锁 ...

  9. Java - “JUC”锁

    [Java并发编程实战]-----“J.U.C”:锁,lock   在java中有两种方法实现锁机制,一种是在前一篇博客中([java7并发编程实战]-----线程同步机制:synchronized) ...

  10. Java 线程与锁

    Synchronization synchronized语法可以获取锁, 当其他线程持有锁的时候该线程想要获取锁将会进入等待状态, 直到没有其他线程持有该锁 显示使用 synchronized (lo ...

随机推荐

  1. 使用 IntraWeb (1) - 先测试如何部署为 Asp.Net 的应用

    IntraWeb 14 可以部署为 Asp.Net 的应用程序, 需要 NET Framework 4.5 和 ASP.NET MVC 4 或之上版本的支持; 这下, 只能用虚拟主机的朋友有福了! 我 ...

  2. C# 判断字符编码的六种方法

    方法一http://blog.csdn.net/qiujiahao/archive/2007/08/09/1733169.aspx在unicode 字符串中,中文的范围是在4E00..9FFF:CJK ...

  3. WebLogic使用总结(三)——WebLogic配置JNDI数据源

    一.在WebLogic新建针对Oracle数据库的JNDI数据源 进入weblogic管理控制台,此处是远程访问:http://192.168.1.144:7001/console 点击左侧[ 域结构 ...

  4. 恶意软件正在利用SSLserver窃取用户个人信息!

    安全套接层协议(SSL)及安全传输层协议(TLS)旨在提供一个安全.加密的client和server之间的连接网络.为进一步进行身份验证和加密,server必须提供证书,从而直接有效地证明其身份. 使 ...

  5. firedac数据集和字符串之间相互转换

    firedac数据集和字符串之间相互转换 /// <author>cxg 2018-12-20</author> unit DatasetString; interface u ...

  6. iOS 程序插件及功能动态更新思路

    所用框架及语言 iOS客户端-Wax(开发愤怒的小鸟的连接Lua 和 Objc的框架),Lua,Objc, 服务端-Java(用于返回插件页面) 工具框架链接地址:Wax - https://gith ...

  7. Oracle Apps DBA R12.2 Syllabus

    1. What is Oracle R12.2 R12.2 Definition Architecture Advantages of R12.2 Limitations of R12.2 What ...

  8. 安装GCC-4.6.1详细教程

    一.什么是Gcc Linux系统下的Gcc(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作品之一.gcc是可以在多种硬体平台上编译出可执行程序的超级编译 ...

  9. 【docker】docker部署spring boot服务 选择配置文件启动

    默认启动命令: docker run --name swapping -itd --net=host -v /etc/localtime:/etc/localtime:ro -v /etc/timez ...

  10. NSObject的hash方法

    NSObject的hash方法 说明 本示例仅仅演示一个对象什么时候执行hash方法. 细节 1. 必要的Model类,重载了hash方法用以反映Hash方法是否被调用了 2. 测试 // // Vi ...