当前位置:网站首页>涨姿势了!原来这才是多线程正确实现方式
涨姿势了!原来这才是多线程正确实现方式
2022-07-30 15:19:00 【InfoQ】
ava内存模型


线程同步
锁概述

锁的作用
锁的相关概念
可重入性:一个线程持有该锁的时候能够再次/多次申请该锁
锁的争用与调度
锁的粒度
内部锁:Synchronized
Synchronized(对象锁){ 同步代码块,可以在同步代码块中访问共享数据}Synchronized同步代码块
public class SynchronizedLock { public static void main(String[] args) { SynchronizedLock synchronizedLock=new SynchronizedLock(); for (int i = 0; i <2 ; i++) { new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm(); } }.start(); } } public void mm() { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } }}
public class SynchronizedLock { public static void main(String[] args) { SynchronizedLock synchronizedLock=new SynchronizedLock(); for (int i = 0; i <2 ; i++) { new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm();//使用锁的对象是synchronizedLock对象 } }.start(); } } public void mm() { synchronized (this)//this作为当前对象 { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } }}
锁对象不同不能实现同步
public class SynchronizedLock { public static void main(String[] args) { SynchronizedLock synchronizedLock=new SynchronizedLock(); SynchronizedLock synchronizedLock2=new SynchronizedLock(); new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm();//使用锁的对象是synchronizedLock对象 } }.start(); new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock2.mm();//使用锁的对象是synchronizedLock对象 } }.start(); } public void mm() { synchronized (this)//this作为当前对象 { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } }}
使用常量作为锁对象
public class SynchronizedLock { public static void main(String[] args) { SynchronizedLock synchronizedLock=new SynchronizedLock(); SynchronizedLock synchronizedLock2=new SynchronizedLock(); new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm();//使用锁的对象是synchronizedLock对象 } }.start(); new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm();//使用锁的对象是synchronizedLock对象 } }.start(); } public static final Object obj=new Object(); public void mm() { synchronized (obj)//常量作为当前对象 { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } }}同步实例方法
public class SynchronizedLock { public static void main(String[] args) { SynchronizedLock synchronizedLock=new SynchronizedLock(); new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm(); } }.start(); new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm2(); } }.start(); } //同步实例方法 public synchronized void mm() { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } public void mm2() { synchronized (this)//常量作为当前对象 { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } }}同步静态方法
public class SynchronizedLock { public static void main(String[] args) { SynchronizedLock synchronizedLock=new SynchronizedLock(); new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm2(); } }.start(); new Thread(new RunnableThread()) { @Override public void run() { SynchronizedLock.mm();//使用锁的对象是SynchronizedLock.class } }.start(); } //同步静态方法 public synchronized static void mm() { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } public void mm2() { synchronized (SynchronizedLock.class)//常量作为当前对象 { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } }}同步代码块和同步方法如何选择
public class SynchronizedLock { public static void main(String[] args) { SynchronizedLock synchronizedLock=new SynchronizedLock(); new Thread(new RunnableThread()) { @Override public void run() { try { synchronizedLock.mm2(); } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); new Thread(new RunnableThread()) { @Override public void run() { try { synchronizedLock.mm2();//使用锁的对象是SynchronizedLock.class } catch (InterruptedException e) { e.printStackTrace(); } } }.start(); } //同步实例方法 锁的粒度粗 执行效率低 public synchronized void mm() throws InterruptedException { long starttime= System.currentTimeMillis(); System.out.println("start"); Thread.sleep(3000); for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } System.out.println("end"); long Endtime= System.currentTimeMillis(); System.out.println(Endtime-starttime); } //同步代码块 锁的粒度细 并发效率高 public void mm2() throws InterruptedException { System.out.println("start"); Thread.sleep(3000); synchronized (this)//常量作为当前对象 { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } System.out.println("end"); }}脏读
public class Test06 { public static void main(String[] args) throws InterruptedException { User user=new User(); SubThread subThread=new SubThread(user); subThread.start(); user.GetName(); } static class SubThread extends Thread { public User user; public SubThread(User user) { this.user=user; } @Override public void run() { user.SetValue("ww","456"); } } static class User { private String name="ylc"; private String pwd="123"; public void GetName() { System.out.println(Thread.currentThread().getName()+"==>"+name+"密码"+pwd); } public void SetValue(String name,String pwd) { System.out.println("原来为为name="+this.name+",pwd="+this.pwd); this.name=name; this.pwd=pwd; System.out.println("更新为name="+name+",pwd="+pwd); } }}

线程出现异常释放锁
public class SynchronizedLock { public static void main(String[] args) { SynchronizedLock synchronizedLock=new SynchronizedLock(); new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm(); } }.start(); new Thread(new RunnableThread()) { @Override public void run() { synchronizedLock.mm2(); } }.start(); } //同步实例方法 public synchronized void mm() { for (int i = 0; i <100 ; i++) { if(i==50) { Integer.parseInt("abc");//异常设置 } System.out.println(Thread.currentThread().getName()+"-->"+i); } } public void mm2() { synchronized (this) { for (int i = 0; i <100 ; i++) { System.out.println(Thread.currentThread().getName()+"-->"+i); } } }}
死锁
public class Text06_5 { public static void main(String[] args) { SubThread subThread=new SubThread(); SubThread subThread2=new SubThread(); subThread.setName("a"); subThread2.setName("b"); subThread.start();subThread2.start(); } static class SubThread extends Thread { private static final Object lock1=new Object(); private static final Object lock2=new Object(); @Override public void run() { if("a".equals(Thread.currentThread().getName())) { synchronized (lock1) { System.out.println("a 线程 lock1获得了锁,再需要获得lock2"); synchronized (lock2) { System.out.println("a 线程 lock2获得了锁"); } } } if("b".equals(Thread.currentThread().getName())) { synchronized (lock2) { System.out.println("b 线程 lock2获得了锁,再需要获得lock1"); synchronized (lock1) { System.out.println(" b 线程 lock1获得了锁"); } } } } }}
边栏推荐
猜你喜欢

谷歌工程师『代码补全』工具;『Transformers NLP』随书代码;FastAPI开发模板;PyTorch模型加速工具;前沿论文 | ShowMeAI资讯日报

nodejs环境变量设置

2022最新 | 室外单目深度估计研究综述

【开发者必看】【push kit】推送服务典型问题合集2

【HMS core】【FAQ】push kit、AR Engine、广告服务、扫描服务典型问题合集2

后浪来袭!阿里产出“第二代”容器技术手册及脑图,这也太香了吧

Back waves are coming!Ali produced the "second generation" container technical manual and brain map, which is too fragrant

GeoServer + openlayers

70行代码撸一个桌面自动翻译神器

经典实例分割模型Mask RCNN原理与测试
随机推荐
【云原生】阿里云ARMS业务实时监控
100w的数据表比1000w的数据表查询更快吗?
Memory-mapped, bit-band operations
华为ADS获取转化跟踪参数报错:getInstallReferrer IOException: getInstallReferrer not found installreferrer
二、判断 & 循环
golang图片处理库image简介
开源WebGIS架构
使用 TiUP 命令管理组件
Xshell命令
php如何去除字符串最后一位字符
RISC-V calling conventions
Sparse-PointNet: See Further in Autonomous Vehicles 论文笔记
tiup install
ECCV2022 | FPN错位对齐,实现高效半监督目标检测 (PseCo)
Sleuth+Zipkin (visualization) service link tracking
Load Base Split 使用文档
Overview of TiUP commands
C# List<T> 模板的案例
一文读懂Elephant Swap,为何为ePLATO带来如此高的溢价?
为什么数据需要序列化