首页 / JAVA / 解决线程不安全的方式(Java)
解决线程不安全的方式(Java)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了解决线程不安全的方式(Java),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2513字,纯文字阅读大概需要4分钟。
内容图文
![解决线程不安全的方式(Java)](/upload/InfoBanner/zyjiaocheng/633/a840f97f2beb4b72946e4c8ffbc31dd6.jpg)
一、同步代码块
package com.synchronized1; // 买票示例 // 使用同步代码块解决线程安全问题 public class TicketRunnableImp implements Runnable { private int ticket = 100; Object o=new Object(); @Override public void run() { while (true) { synchronized (o){ if (ticket > 0) { System.out.println(Thread.currentThread().getName() + "-->正在售第"+ticket+"张票!"); ticket--; } } } } }
二、同步方法
package com.synchronized2; // 买票示例 // 使用同步方法解决线程安全问题 public class TicketRunnableImp implements Runnable { private int ticket = 100; Object o = new Object(); @Override public void run() { while (true) { func(); } } // 同步方法的锁对象是调用者对象(Runnable对象) public synchronized void func(){ if (ticket > 0) { System.out.println(Thread.currentThread().getName() + "-->正在售第" + ticket + "张票!"); ticket--; } } }
三、静态方法
package com.staticSyn; // 买票示例 // 使用同步方法解决线程安全问题 public class TicketRunnableImp implements Runnable { private static int ticket = 100; Object o = new Object(); @Override public void run() { while (true) { func(); } } // 静态方法的锁对象是本类的class属性 public synchronized static void func(){ if (ticket > 0) { System.out.println(Thread.currentThread().getName() + "-->正在售第" + ticket + "张票!"); ticket--; } } }
四、Lock锁
方式一
package com.lock1; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; // 买票示例 // 使用同步代码块解决线程安全问题 public class TicketRunnableImp implements Runnable { private int ticket = 100; Object o = new Object(); Lock lock=new ReentrantLock(); @Override public void run() { while (true) { lock.lock(); if (ticket > 0) { System.out.println(Thread.currentThread().getName() + "-->正在售第" + ticket + "张票!"); ticket--; } lock.unlock(); } } }
方式二
package com.lock2; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; // 买票示例 // 使用同步代码块解决线程安全问题 public class TicketRunnableImp implements Runnable { private int ticket = 100; Object o = new Object(); Lock lock = new ReentrantLock(); @Override public void run() { while (true) { lock.lock(); try { if (ticket > 0) { System.out.println(Thread.currentThread().getName() + "-->正在售第" + ticket + "张票!"); ticket--; } } catch (Exception e) { System.out.println(e); } finally { lock.unlock(); } } } }
五、上述几种方式的测试类
package com.lock2; public class DemoTicket { public static void main(String[] args) { TicketRunnableImp t=new TicketRunnableImp(); Thread t1=new Thread(t); Thread t2=new Thread(t); Thread t3=new Thread(t); t1.start(); t2.start(); t3.start(); } }
内容总结
以上是互联网集市为您收集整理的解决线程不安全的方式(Java)全部内容,希望文章能够帮你解决解决线程不安全的方式(Java)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。