当前位置:网站首页>涨姿势了!原来这才是多线程正确实现方式
涨姿势了!原来这才是多线程正确实现方式
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获得了锁"); } } } } }}

边栏推荐
- Data Analysis Tools - DDL operations & DML operations in HQL
- L2-007 Family property (use of vector, set, map)
- Is Redis really slow?
- Databases - create databases, tables, functions, etc.
- 数据库 - 创建数据库、表、函数等
- Sleuth+Zipkin (visualization) service link tracking
- nodejs environment variable settings
- Placement Rules 使用文档
- GeoServer + openlayers
- JHM:芳环羟化双加氧酶数据库DARHD建立及相关引物评价
猜你喜欢
Mysql database query is very slow. Besides the index, what else can be caused?
HTTP缓存小结
481-82(105、24、82、34、153)
golang modules初始化项目
Alluxio for Presto fu can across the cloud self-service ability
谷歌工程师『代码补全』工具;『Transformers NLP』随书代码;FastAPI开发模板;PyTorch模型加速工具;前沿论文 | ShowMeAI资讯日报
ISELED---氛围灯方案的新选择
三维重建方法汇总
本地事务与分布式事务
深度学习遇到报错Bug解决方法(不定时更新)
随机推荐
php如何截取字符串的前几位
When the vite multi-page application refreshes the page, it will not be in the current route and will return to the root route
服务器装好系统的电脑怎么分区
近段时间的学习碎片整理(24)
工具| execsnoop 短时进程追踪工具
TiUP terms and core concepts
Data Analysis Tools - DDL operations & DML operations in HQL
动态规划 --- 状态压缩DP 详细解释
[Cloud Native] Service Industry Case - Solutions for Unpredictable Concurrency Scenarios
L2-007 Family property (use of vector, set, map)
(Popular Science) What is Fractional NFT (Fractional NFT)
Mysql database query is very slow. Besides the index, what else can be caused?
微服务该如何拆分?
R中按照数字大小进行排序
Is Redis really slow?
深度学习遇到报错Bug解决方法(不定时更新)
经典实例分割模型Mask RCNN原理与测试
数据库-SQL
使用 TiUP 命令管理组件
Golang分布式应用之Redis怎么使用