Java多线程下解决数据安全问题
同步代码块
基本语句
synchronized (任意对象) {
操作共享代码
}
代码示例
public class SellTicket implements Runnable { private int tickets = 100; private Object object = new Object(); @Override public void run() { while (true) { synchronized (object) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票"); tickets--; } } } } public static void main(String[] args) { SellTicket sellTicket = new SellTicket(); Thread thread1 = new Thread(sellTicket, "窗口1"); Thread thread2 = new Thread(sellTicket, "窗口2"); Thread thread3 = new Thread(sellTicket, "窗口3"); thread1.start(); thread2.start(); thread3.start(); } }
优缺点:
- 解决了多线程的数据安全问题
- 多线程时,每个线程都会判断同步上的锁,耗费资源,降低了程序的运行效率
同步方法
同步方法:将synchronized关键字加到方法上
- 格式: 修饰符 synchronized 返回值类型 方法名(){ }
- 同步方法的锁对象是this
同步静态方法,就是把synchronized关键字加到静态方法上
- 格式: 修饰符 static synchronized 返回值类型 方法名(){ }
- 同步静态方法的锁对象是 类名.class
代码示例
public class SellTicket implements Runnable { // private int tickets = 100; private static int tickets = 100; private Object object = new Object(); private int x = 0; @Override public void run() { while (true) { if (x % 2 == 0) { // synchronized (object) { // synchronized (this) { synchronized (SellTicket.class) { if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票"); tickets--; } } } else { // synchronized (object) { // if (tickets > 0) { // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票"); // tickets--; // } // } sellTicket(); } x++; } } // private void sellTicket(){ // synchronized (object) { // if (tickets > 0) { // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票"); // tickets--; // } // } // } // private synchronized void sellTicket(){ // if (tickets > 0) { // try { // Thread.sleep(100); // } catch (InterruptedException e) { // e.printStackTrace(); // } // System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票"); // tickets--; // } private static synchronized void sellTicket(){ if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票"); tickets--; } } public static void main(String[] args) { SellTicket sellTicket = new SellTicket(); Thread thread1 = new Thread(sellTicket, "窗口1"); Thread thread2 = new Thread(sellTicket, "窗口2"); Thread thread3 = new Thread(sellTicket, "窗口3"); thread1.start(); thread2.start(); thread3.start(); } }
lock锁
lock实现提供比使用synchronized方法和语句可获得更广泛的操作
- void lock()获得锁
- void unlock()释放
lock是接口不能直接实例化,采用实现类实例化ReentrantLock
import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class SellTicket implements Runnable { private int tickets = 100; private Object object = new Object(); private Lock lock = new ReentrantLock(); @Override public void run() { while (true) { try { lock.lock(); if (tickets > 0) { try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println(Thread.currentThread().getName() + "正在出售第" + tickets + "张票"); tickets--; } } finally { lock.unlock(); } } } public static void main(String[] args) { SellTicket sellTicket = new SellTicket(); Thread thread1 = new Thread(sellTicket, "窗口1"); Thread thread2 = new Thread(sellTicket, "窗口2"); Thread thread3 = new Thread(sellTicket, "窗口3"); thread1.start(); thread2.start(); thread3.start(); }
到此这篇关于Java多线程下解决数据安全问题的文章就介绍到这了,更多相关java多线程数据安全内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
聊聊SpringBoot使用Nacos进行服务注册发现与配置管理问题
Nacos支持基于DNS和基于RPC的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。本文重点给大家介绍SpringBoot使用Nacos进行服务注册发现与配置管理,感兴趣的朋友一起看看吧2022-01-01Spring实战之使用Expression接口进行表达式求值操作示例
这篇文章主要介绍了Spring实战之使用Expression接口进行表达式求值操作,结合实例形式分析了Spring操作Expression接口实现表达式运算的操作技巧与相关注意事项,需要的朋友可以参考下2019-12-12关于idea更新到2020.2.3无法创建web项目原因 library is not specified
这篇文章主要介绍了关于idea更新到2020.2.3无法创建web项目原因 library is not specified,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2020-10-10解决Spring Security集成knife4j访问接口文档出现403的问题
这篇文章主要给大家介绍了如何解决Spring Security集成knife4j访问接口文档出现403的问题,文中有详细的解决方案,有需要的朋友可以参考阅读下2023-07-07
最新评论