博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
JAVA多线程-JUC-8锁
阅读量:3931 次
发布时间:2019-05-23

本文共 9448 字,大约阅读时间需要 31 分钟。

1.标准访问,请问先打印邮件还是短信?

答案:

锁住当前的 phone对象 (this) 两个线程竞争的同一把锁

A*********sendEmailB*********sendSMS
class Phone{
public synchronized void sendEmail() throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sendEmail"); } public synchronized void sendSMS()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sendSMS"); } }
public class Lock8Demo5 {
public static void main(String[] args) throws Exception {
Phone phone = new Phone(); new Thread(()->{
try {
phone.sendEmail(); } catch (Exception e) {
e.printStackTrace(); } },"A").start(); TimeUnit.SECONDS.sleep(1); new Thread(()->{
try {
phone.sendSMS(); } catch (Exception e) {
e.printStackTrace(); } },"B").start(); }}

2.暂停四秒中在邮件方法 请问先打印邮件还是短信?

答案:

锁住当前的Phone对象 (this)

A*********sendEmail //...睡眠四秒中后B*********sendSMS
class Phone{
public synchronized void sendEmail() throws Exception{
//暂停四秒钟 TimeUnit.SECONDS.sleep(4); System.out.println(Thread.currentThread().getName()+"*********sendEmail"); } public synchronized void sendSMS()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sendSMS"); } }
public class Lock8Demo5 {
public static void main(String[] args) throws Exception {
Phone phone = new Phone(); new Thread(()->{
try {
phone.sendEmail(); } catch (Exception e) {
e.printStackTrace(); } },"A").start(); TimeUnit.SECONDS.sleep(1); new Thread(()->{
try {
phone.sayHello(); } catch (Exception e) {
e.printStackTrace(); } },"B").start(); }}

3.新增普通SayHello方法 ,请问先打印邮件还是hello

答案:

B*********sayHelloA*********sendEmail
class Phone{
public synchronized void sendEmail() throws Exception{
//暂停四秒钟 TimeUnit.SECONDS.sleep(4); System.out.println(Thread.currentThread().getName()+"*********sendEmail"); } public synchronized void sendSMS()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sendSMS"); } public void sayHello()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sayHello"); } }
public class Lock8Demo5 {
public static void main(String[] args) throws Exception {
Phone phone = new Phone(); new Thread(()->{
try {
phone.sendEmail(); } catch (Exception e) {
e.printStackTrace(); } },"A").start(); TimeUnit.SECONDS.sleep(1); new Thread(()->{
try {
phone.sayHello(); } catch (Exception e) {
e.printStackTrace(); } },"B").start(); }}

4.两部手机,请问先打印邮件还是短信

答案:

B*********sendSMSA*********sendEmail
class Phone{
public synchronized void sendEmail() throws Exception{
//暂停四秒钟 TimeUnit.SECONDS.sleep(4); System.out.println(Thread.currentThread().getName()+"*********sendEmail"); } public synchronized void sendSMS()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sendSMS"); } public void sayHello()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sayHello"); } }
public class Lock8Demo5 {
public static void main(String[] args) throws Exception {
Phone phone1 = new Phone(); Phone phone2 = new Phone(); new Thread(()->{
try {
phone1.sendEmail(); } catch (Exception e) {
e.printStackTrace(); } },"A").start(); TimeUnit.SECONDS.sleep(1); new Thread(()->{
try {
phone2.sendSMS(); } catch (Exception e) {
e.printStackTrace(); } },"B").start(); }}

5.两个静态同步方法,同一部手机,请问先打印邮件 还是短信?

答案:

静态锁的是Class -会阻塞

A*********sendEmailB*********sendSMS
class Phone{
public static synchronized void sendEmail() throws Exception{
//暂停四秒钟 TimeUnit.SECONDS.sleep(4); System.out.println(Thread.currentThread().getName()+"*********sendEmail"); } public static synchronized void sendSMS()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sendSMS"); } public void sayHello()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sayHello"); } }
public class Lock8Demo5 {
public static void main(String[] args) throws Exception {
Phone phone1 = new Phone(); Phone phone2 = new Phone(); new Thread(()->{
try {
phone1.sendEmail(); } catch (Exception e) {
e.printStackTrace(); } },"A").start(); TimeUnit.SECONDS.sleep(1); new Thread(()->{
try {
phone1.sendSMS(); } catch (Exception e) {
e.printStackTrace(); } },"B").start(); }}

6.两个静态同步方法,两部手机,请问先打印邮件 还是短信?

答案:

静态锁的是Class -会阻塞

A*********sendEmailB*********sendSMS
class Phone{
public static synchronized void sendEmail() throws Exception{
//暂停四秒钟 TimeUnit.SECONDS.sleep(4); System.out.println(Thread.currentThread().getName()+"*********sendEmail"); } public static synchronized void sendSMS()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sendSMS"); } public void sayHello()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sayHello"); } }
public class Lock8Demo5 {
public static void main(String[] args) throws Exception {
Phone phone1 = new Phone(); Phone phone2 = new Phone(); new Thread(()->{
try {
phone1.sendEmail(); } catch (Exception e) {
e.printStackTrace(); } },"A").start(); TimeUnit.SECONDS.sleep(1); new Thread(()->{
try {
phone2 .sendSMS(); } catch (Exception e) {
e.printStackTrace(); } },"B").start(); }}

7.一个静态同步方法,一个普通同步方法 同一部手机,请问先打印邮件 还是短信?

答案:

B*********sendSMSA*********sendEmail
class Phone{
public static synchronized void sendEmail() throws Exception{
//暂停四秒钟 TimeUnit.SECONDS.sleep(4); System.out.println(Thread.currentThread().getName()+"*********sendEmail"); } public synchronized void sendSMS()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sendSMS"); } }
public class Lock8Demo5 {
public static void main(String[] args) throws Exception {
Phone phone1 = new Phone(); Phone phone2 = new Phone(); new Thread(()->{
try {
phone1.sendEmail(); } catch (Exception e) {
e.printStackTrace(); } },"A").start(); TimeUnit.SECONDS.sleep(1); new Thread(()->{
try {
phone1.sendSMS(); } catch (Exception e) {
e.printStackTrace(); } },"B").start(); }}

8.一个静态同步方法,一个普通同步方法 两部手机,请问先打印邮件 还是短信?

答案:

B*********sendSMSA*********sendEmail
class Phone{
public static synchronized void sendEmail() throws Exception{
//暂停四秒钟 TimeUnit.SECONDS.sleep(4); System.out.println(Thread.currentThread().getName()+"*********sendEmail"); } public synchronized void sendSMS()throws Exception{
System.out.println(Thread.currentThread().getName()+"*********sendSMS"); } }
public class Lock8Demo5 {
public static void main(String[] args) throws Exception {
Phone phone1 = new Phone(); Phone phone2 = new Phone(); new Thread(()->{
try {
phone1.sendEmail(); } catch (Exception e) {
e.printStackTrace(); } },"A").start(); TimeUnit.SECONDS.sleep(1); new Thread(()->{
try {
phone2.sendSMS(); } catch (Exception e) {
e.printStackTrace(); } },"B").start(); }}

结论:static 锁的是Class类(类锁) 非static 锁的是 对象(对象锁),判断两个线程竞争的是不是同一把锁

总结:

对象锁:

一个对象里面如果有多个synchronized 方法,某一个时间内,只要有一个线程调用其中一个synchronized 方法了,其他线程只能等待,换句话说,某一个时间内,只能唯有一个线程访问这些synchronized 方法

总结:锁的是当前对象this,被锁定后,其他的线程都不能进入到当前对象的其他synchronized 方法

非synchronized 不与 非静态 synchronized 竞争同一把锁

转载地址:http://suqgn.baihongyu.com/

你可能感兴趣的文章
架构设计:系统间通信(44)——自己动手设计ESB(5)
查看>>
架构设计:系统存储(1)——块存储方案(1)
查看>>
架构设计:系统间通信(42)——自己动手设计ESB(3)
查看>>
在工作时走神的闪光
查看>>
Ajax使用注意事项
查看>>
使用FileChannel下载本地文件及扩展
查看>>
linux文件权限与目录配置问题与解答(整理篇)
查看>>
linux文件与目录管理问题与回答(整理篇)
查看>>
java 数组笔记整理
查看>>
java IO/NIO 下载上传的笔记
查看>>
对行为的描述---一般系统论读书笔记
查看>>
贪心算法
查看>>
分支限界法
查看>>
随机化算法
查看>>
项目整体管理(一)
查看>>
项目整体管理(二)
查看>>
推荐阅读书籍
查看>>
外包管理
查看>>
项目管理师职业道德规范
查看>>
战略管理概述
查看>>