湖南做网站 尖端磐石网络wordpress 所有过滤器
- 作者: 五速梦信息网
- 时间: 2026年03月21日 10:52
当前位置: 首页 > news >正文
湖南做网站 尖端磐石网络,wordpress 所有过滤器,电商平台建设公司,给wordpress替换主题线程安全与线程同步
1.什么是线程安全问题#xff1f;
多个线程同时操作同一个共享资源的时候#xff0c;可能会出现业务安全问题
取钱的线程安全问题场景#xff1a;
两个人他们有一个共同的账户#xff0c;余额是10万元#xff0c;如果两个人同时来取钱#xff0c;…线程安全与线程同步
1.什么是线程安全问题
多个线程同时操作同一个共享资源的时候可能会出现业务安全问题
取钱的线程安全问题场景
两个人他们有一个共同的账户余额是10万元如果两个人同时来取钱并且2人各自都在取钱10万元可能会出现什么问题 1线程安全问题出现的原因
存在多个线程在同时执行同时访问一个共享资源存在修改该共享资源
2.线程同步
线程同步就是解决线程安全问题的方案
1线程同步的思想让多个线程实现先后依次访问共享资源这样就解决了安全问题
2线程同步的常见方案
加锁每次只允许一个线程加锁加锁后才能进入访问访问完毕后自动解锁然后其他线程才能再加锁进来
3线程同步方式 方式一同步代码块 ①作用把访问共享资源的核心代码给上锁以此保证线程的安全 ②原理每次只允许一个线程加锁后进入执行完毕后自动解锁其他线程才可以进来执行 ③同步锁的注意事项对于当前同时执行的线程来说同步锁必须是同一把同一个对象否则会出bug ④锁对象不能随便选择一个唯一的对象,会影响其他无关线程的执行,例如String字符串 ⑤锁对象的使用规范 建议使用共享资源作为锁对象对于实例方法建议使用this作为锁对象对于静态方法建议使用字节码类名.class对象作为锁对象
public class Demo {public static void main(String[] args) {//3、创建账户对象共享数据Account acc new Account(9527, 100000);//4、两个线程同时取款多个线程操作共享数据出现线程安全问题new MyThread(acc, 小明).start();new MyThread(acc, 小红).start();}
}
//2、线程类封装取款的代码
class MyThread extends Thread {private Account acc;public MyThread(Account acc, String name) {super(name);this.acc acc;}Overridepublic void run() {//取钱时要传递取款金额acc.drawMoney(100000);}
}//1、账户类包含取款功能
class Account {//卡号private String cardID;//余额private double money;public Account() {}public Account(String cardID, double money) {this.cardID cardID;this.money money;}public String getCardID() {return cardID;}public void setCardID(String cardID) {this.cardID cardID;}public double getMoney() {return money;}public void setMoney(double money) {this.money money;}//取款功能参数money为取款金额public void drawMoney(double money) {//获取当前线程对象的名称String name Thread.currentThread().getName();synchronized (this) {if (this.money money) {System.out.println(name 取钱 money 成功);this.money - money;System.out.println(name 取钱后余额为 this.money);} else {System.out.println(name 取钱失败余额不足);}}}//对于静态方法建议使用字节码类名.class对象作为锁对象public static void test(){synchronized (Account.class){}}
}方式二同步方法 ①作用把访问共享资源的核心方法上锁以此保证线程安全 ②原理每次只允许一个线程加锁后进入执行完毕后自动解锁其他线程才可以进来执行 ③同步方法的底层原理 同步方法其实底层也是由隐式锁对象的只是锁的范围是整个方法代码如果方法是实例方法同步方法默认this作为锁的对象如果方法是静态方法同步方法默认用类名.class作为锁对象
//线程类和测试类同上
//1、账户类包含取款功能
class Account {//卡号private String cardID;//余额private double money;public Account() {}public Account(String cardID, double money) {this.cardID cardID;this.money money;}public String getCardID() {return cardID;}public void setCardID(String cardID) {this.cardID cardID;}public double getMoney() {return money;}public void setMoney(double money) {this.money money;}//取款功能参数money为取款金额public synchronized void drawMoney(double money) {String name Thread.currentThread().getName();if (this.money money) {System.out.println(name 取钱 money 成功);this.money - money;System.out.println(name 取钱后余额为 this.money);} else {System.out.println(name 取钱失败余额不足);}}//静态方法public synchronized static void test(){}
}④同步代码块和同步方法的区别
同步代码块锁对象可以指定锁的范围可以指定性能高且灵活
同步方法锁对象不能指定锁的是方法体阅读性更高 方式三Lock锁 ①Lock锁是JDK5开始提供的一个新的锁定操作通过它可以创建出锁对象进行加锁和解锁更灵活、更方便、更强大 ②Lock是接口不能直接被实例化可以采用它的实现类ReentrantLock来构建Lock锁对象 public ReentrantLock()获得Lock锁的实现类对象 ③Lock的常用方法 void lock()获得锁void unlock()释放锁 ④Lock锁使用规范 锁对象创建在成员位置使用final修饰释放锁的代码写在finally块中 public class Demo {public static void main(String[] args) {//3、创建账户对象共享数据Account acc new Account(9527, 100000);//4、两个线程同时取款多个线程操作共享数据出现线程安全问题new MyThread(acc, 小明).start();new MyThread(acc, 小红).start();}
}
//2、线程类封装取款的代码
class MyThread extends Thread {private Account acc;public MyThread(Account acc, String name) {super(name);this.acc acc;}Overridepublic void run() {//取钱时要传递取款金额acc.drawMoney(100000);}
}
//1、账户类包含取款功能
class Account {//卡号private String cardID;//余额private double money;//规范1、锁对象创建在成员位置使用final修饰private final ReentrantLock lock new ReentrantLock();public Account() {}public Account(String cardID, double money) {this.cardID cardID;this.money money;}public String getCardID() {return cardID;}public void setCardID(String cardID) {this.cardID cardID;}public double getMoney() {return money;}public void setMoney(double money) {this.money money;}//取款功能参数money为取款金额public void drawMoney(double money) {String name Thread.currentThread().getName();try {//上锁lock.lock();if (this.money money) {System.out.println(name 取钱 money 成功);this.money - money;System.out.println(name 取钱后余额为 this.money);} else {System.out.println(name 取钱失败余额不足);}} catch (Exception e) {e.printStackTrace();} finally {//释放锁lock.unlock();}}
}
- 上一篇: 湖南做网站 f磐石网络百度广告太多
- 下一篇: 湖州 网站建设公司哪家好app定制多少钱
相关文章
-
湖南做网站 f磐石网络百度广告太多
湖南做网站 f磐石网络百度广告太多
- 技术栈
- 2026年03月21日
-
湖南专业做网站公司排名山东省城乡与建设厅网站
湖南专业做网站公司排名山东省城乡与建设厅网站
- 技术栈
- 2026年03月21日
-
湖南专业做网站公司WordPress减少数据库占有
湖南专业做网站公司WordPress减少数据库占有
- 技术栈
- 2026年03月21日
-
湖州 网站建设公司哪家好app定制多少钱
湖州 网站建设公司哪家好app定制多少钱
- 技术栈
- 2026年03月21日
-
湖州高端网站设计做电影网站违法么
湖州高端网站设计做电影网站违法么
- 技术栈
- 2026年03月21日
-
湖州建设局网站网站建设 绍兴的公司
湖州建设局网站网站建设 绍兴的公司
- 技术栈
- 2026年03月21日
