package com.yang.lock;
public class Demo01 {
public static void main(String[] args) {
//这两个还是同一个类型
TicketRunnable ticketRunnable = new TicketRunnable();//创建一个对象
TicketRunnable ticketRunnable1 = new TicketRunnable();
//Thread thread = new Thread(new TicketRunnable(), "第一个窗口");
//Thread thread1 = new Thread(new TicketRunnable(), "第二个窗口");
Thread thread = new Thread(ticketRunnable, "第一个窗口");
Thread thread1 = new Thread(ticketRunnable, "第二个窗口");
System.out.println(ticketRunnable.getClass()==ticketRunnable1.getClass());//true
thread.start();
thread1.start();
}
}
class TicketRunnable implements Runnable {
static int num = 1;
第二,三种
package com.yang.lock;
/*
synchronized 修饰成员方法。
1] synchronized 建议不和run()方法结合使用
2] synchronized 锁的就是this。
3]因为当前锁的是对象锁this,所以要保证是同一个对象
synchronized 修饰静态成员方法。
1] 当前锁 就是类锁 ,传递对象的字节码.class
2] 同一个类创建出不同的对象,但他们对应的.getClass()是一样的
*/
public class Demo02 {
public static void main(String[] args) {
//对象锁 同一个对象
/*TicketRunnable ticketRunnable = new TicketRunnable();//创建一个对象
Thread thread = new Thread(ticketRunnable, "第一个窗口");
Thread thread1 = new Thread(ticketRunnable, "第二个窗口");
thread.start();
thread1.start(); */
//类锁 同一个类
TicketRunnable ticketRunnable = new TicketRunnable();//创建一个对象
TicketRunnable ticketRunnable1 = new TicketRunnable();
Thread thread = new Thread(ticketRunnable, "第一个窗口");
Thread thread1 = new Thread(ticketRunnable1, "第二个窗口");
thread.start();
thread1.start();
}
}
class Ticket implements Runnable{
static int num = 1;
synchronized 缺点
-
如果获得锁的线程由于要等待IO或者其它原因(如sleep())被阻塞了。但又没有释放锁,其它线程只能等待,此时会影响执行效率,甚至造成死锁。
-
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现