解决线程安全问题

编程入门 行业动态 更新时间:2024-10-13 22:22:11

解决<a href=https://www.elefans.com/category/jswz/34/1771240.html style=线程安全问题"/>

解决线程安全问题

 多线程  首先自问什么是线程

自答 线程就是应用程序启动时候在cpu执行的时候的一个桥梁路径 称之为线程

再问 怎么创建线程 

自答 两种方式 一种继承Thread 一种实现Runnable接口

还问 怎么启动线程

针对继承Thread的方式 可以直接Thread t = new Thread(),重写run方法 然后t.start方法启动

再对实现Runnable接口 可以多态Runnable run = new RunnableImpl(),然后在实现

Thread t = new Thread (run),再次t.start 启动 第二种看似多出一步,但是因为是实现接口 所以扩展性 灵活性都要优于继承。

明天再问 准备回家 

接着问 

 线程安全有几种方式?

 1.synchronized代码块 

 2. synchronized方法  静态synchronized方法 

 3.使用Lock锁

 

package cn.itcast.day12.demo09;/*** @author admin* @version 1.0.0* @ClassName RunnableImpl.java* @Description TODO* @createTime 2021年09月28日 18:47:00*/import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;/*** 卖票案例出现了线程安全问题* 卖出了不存在的票和重复的票** 解决线程安全问题的三种方案:使用lock锁* java.util.concurrent.locks.Lock接口** Lock实现提供了比使用synchronized方法和语句获得更广泛的锁定操作* Lock接口中的方法*  void Lock()获取锁*  void unlock() 释放锁* java.util.concurrent.Locks.ReentrantLock implements Lock接口** 使用步骤*      1.在成员位置创建一个ReentrantLock对象*      2.在有可能会出现安全问题的代码前调用Lock接口中的方法Lock获取锁*      3.有可能会出现安全问题的代码后调用Lock接口中的方法unlock关闭所****/
public class RunnableImpl implements Runnable {// 定义一个多线程共享资源private int ticket = 100;// 1.在成员位置创建一个ReentrantLock对象Lock l = new ReentrantLock();// 设置线程任务 卖票@Overridepublic void run() {// 使用死循环 让卖票操作重复操作while (true) {//  2.在有可能会出现安全问题的代码前调用Lock接口中的方法Lock获取锁l.lock();// 先判断票是否存在if (ticket > 0) {// 提高安全问题出现的概率,让程序睡眠try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}System.out.println(Thread.currentThread().getName() + "正在卖第" + ticket + "张票");ticket--;}l.unlock();}}}
package cn.itcast.day12.demo09;/*** @author admin* @version 1.0.0* @ClassName Demo01Ticket.java* @Description TODO* @createTime 2021年09月28日 14:23:00*//*** 模拟卖票案例*  创建3个线程,同时开启,对共享的票进行出售**/
public class Demo01Ticket {public static void main(String[] args) {// 创建Runnable接口的实现类Runnable run = new RunnableImpl();// 创建Thread类对象 构造方法中传递Runnable接口的实现类对象Thread t = new Thread(run);Thread t1 = new Thread(run);Thread t2 = new Thread(run);// 调用start方法开启多线程t.start();t1.start();t2.start();}
}

更多推荐

解决线程安全问题

本文发布于:2024-03-14 04:44:17,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1735654.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:线程   安全问题

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!