Java线程八锁
package com.atguigu.juc1205; import java.util.concurrent.TimeUnit; class Phone//Phone.java ---> Phone.class Class.forName();
{
public static synchronized void sendEmail()throws Exception
{
TimeUnit.SECONDS.sleep(4);//用此工具类下的SECONDS MINUTES 不必向Thread.sleep以毫秒为单位
System.out.println("*****sendEmail");
}
public synchronized void sendSMS()throws Exception
{
System.out.println("*****sendSMS");
}
public void sayHello()throws Exception
{
System.out.println("*****sayHello");
}
} /**
* @auther zzyy
* 8 lock
*1 标准访问,请问先打印邮件还是短信 sendEmail sendSMS
*2 暂停4秒钟在邮件方法,请问先打印邮件还是短信 sendEmail sendSMS
*3 新增普通sayHello方法,请问先打印邮件还是hello sayHello sendEmail
*4 两部手机,请问先打印邮件还是短信 sendSMS sendEmail
*5 两个静态同步方法,同一部手机,请问先打印邮件还是短信 sendEmail sendSMS
*6 两个静态同步方法,2部手机,请问先打印邮件还是短信 sendEmail sendSMS
*7 1个静态同步方法,1个普通同步方法,同一部手机,请问先打印邮件还是短信 sendSMS sendEmail
*8 1个静态同步方法,1个普通同步方法,2部手机,请问先打印邮件还是短信 sendSMS sendEmail
*
*/
public class Lock8Demo05
{
public static void main(String[] args) throws InterruptedException
{
Phone phone = new Phone();
Phone phone2 = new Phone(); new Thread(() -> {
try
{
phone.sendEmail();
} catch (Exception e) {
e.printStackTrace();
}
},"A").start(); Thread.sleep(100);//加上sleep一定是先启动A线程后启动B线程,没有sleep线程A和B随机启动,不受控制 new Thread(() -> {
try
{
//phone.sendSMS();
//phone.sayHello();
phone2.sendSMS();
} catch (Exception e) {
e.printStackTrace();
}
},"B").start(); }
} /**
*分析
*1 2 一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,
* 其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法
* 锁的是当前对象this,被锁定后,其它的线程都不能进入到当前对象的其它的synchronized方法
*3 加个普通方法后发现和同步锁无关
*4 换成两个对象后,不是同一把锁了,情况立刻变化。
*5 6 都换成静态同步方法后,情况又变化
* 所有的非静态同步方法用的都是同一把锁——实例对象本身,
*
* synchronized实现同步的基础:Java中的每一个对象都可以作为锁。
* 具体表现为以下3种形式。
* 对于普通同步方法,锁是当前实例对象。
* 对于同步方法块,锁是Synchonized括号里配置的对象。
* 对于静态同步方法,锁是当前类的Class对象。 * 当一个线程试图访问同步代码块时,它首先必须得到锁,退出或抛出异常时必须释放锁。
* 也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,
* 可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,
* 所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。
*
* 7 8 所有的静态同步方法用的也是同一把锁——类对象Class本身,
* 这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的。
* 但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,
* 而不管是同一个实例对象的静态同步方法之间,
* 还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!
**/
Java线程八锁的更多相关文章
- Java多线程——线程八锁案例分析
		
Java多线程——线程八锁案例分析 摘要:本文主要学习了多线程并发中的一些案例. 部分内容来自以下博客: https://blog.csdn.net/dyt443733328/article/deta ...
 - java多线程 -- 线程八锁
		
一个对象里面如果有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其它的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些 ...
 - 读-写锁 ReadWriteLock & 线程八锁
		
读-写锁 ReadWriteLock: ①ReadWriteLock 维护了一对相关的锁,一个用于只读操作, 另一个用于写入操作. 只要没有 writer,读取锁可以由 多个 reader 线程同时保 ...
 - Java线程:锁
		
一.锁的原理 Java中每个对象都有一个内置锁,当程序运行到非静态的synchronized同步方法上时,自动获得与正在执行的代码类的当前实例(this实例)有关的锁.获得一个对象的锁也称为获取锁.锁 ...
 - (三)juc高级特性——虚假唤醒 / Condition / 按序交替 / ReadWriteLock / 线程八锁
		
8. 生产者消费者案例-虚假唤醒 参考下面生产者消费者案例: /* * 生产者和消费者案例 */ public class TestProductorAndConsumer { public stat ...
 - GUC-10 线程八锁
		
/* * 题目:判断打印的 "one" or "two" ? * * 1. 两个普通同步方法,两个线程,标准打印, 打印? //one two * 2. 新增 ...
 - 重学JAVA基础(八):锁的基本知识
		
1.线程状态 如上图,当我们新建一个线程,并start后,其实不一定会马上执行,因为只有操作系统调度了我们的线程,才能真正进行执行,而操作系统也随时可以运行其他线程,这时线程又回到可运行状态.这个过程 ...
 - Java 线程与锁
		
Synchronization synchronized语法可以获取锁, 当其他线程持有锁的时候该线程想要获取锁将会进入等待状态, 直到没有其他线程持有该锁 显示使用 synchronized (lo ...
 - Java线程与锁
		
概要:线程的实现方法. 线程调度.线程状态及转换.线程安全(5种分类.3种实现方法.锁优化技术) 进程是OS进行资源分配的基本单位,线程是CPU调度的基本单位. 1.线程的实现方法 可参阅 我是一个进 ...
 
随机推荐
- Spring Boot -- 外部配置的属性使用
			
Spring Boot允许使用propertities文件.yaml文件或者命令行参数作为外部配置. 命令行参数配置 Spring Boot可以基于jar包运行,打成jar包的程序可以直接通过下面的命 ...
 - WPF TreeView Indent 减少节点的缩进
			
www.swack.cn - 原文链接:WPF TreeView Indent 减少节点的缩进 问题 最近一个需求,需要在界面中实现Windows资源管理器TreeView的界面.但是我发现,我做出的 ...
 - C# 修改PNG图片metadata信息 (含转载fancyblogs博文)
			
WPF中使用 metadata-extractor可以轻松获取 PNG图片metadata信息 NuGet 获取地址: PM> Install-Package MetadataExtractor ...
 - PHP  获取天气
			
/** * 获取天气 */ function get_tq () { //获取用户ip地址 $ip = get_real_ip(); // $ip = '123.125.71.38'; //根据ip地 ...
 - 人生苦短我用Python,本文助你快速入门
			
目录 前言 Python基础 注释 变量 数据类型 浮点型 复数类型 字符串 布尔类型 类型转换 输入与输出 运算符 算术运算符 比较运算符 赋值运算符 逻辑运算符 if.while.for 容器 列 ...
 - 【Java】集合框架(List Set Map)
			
文章目录 集合框架 List(列表) ArrayList 案例 Set HashSet 案例 iterator(迭代器) Map HashMap 案例 集合总结 参考资料 重新搞一波 复习巩固 简单记 ...
 - 【EXP】exp-00091解决办法
			
如果遇到exp的话一般都是因为字符集的问题 解决办法: 1.在oracle中查看数据库的字符集 SQL> select userenv('language') from dual; USEREN ...
 - 【EXP】比较大的dmp文件导入的时候可以将界面关掉
			
有一个需求,将一个dmp文件导入到数据库中,但是这个crt的回话有timeout,3分钟,所以一到三分钟就掉线,导入就失败了,这让人很头疼,关闭界面,imp也就终止了 最后想到了几招,分享一下: 1. ...
 - 【Oracle】oracle pctfree和pctused详解
			
oracle pctfree和pctused详解 一.建立表时候,注意PCTFREE参数的作用 PCTFREE:为一个块保留的空间百分比,表示数据块在什么情况下可以被insert,默认是10,表示当数 ...
 - Sentinel上下文创建及执行
			
Sentinel上下文创建及执行,入口示例代码: public static void fun() { Entry entry = null; try { entry = SphU.entry(SOU ...