关于如何解决java线程安全问题?很重要? 快拿小本本记下来!

线程安全问题

什么是线程安全问题?

多个线程操作同一个共享资源的时候可能会出现线程安全问题。

如何解决线程安全问题?

使用线程同步

线程同步

什么是线程同步?

线程同步是多个线程同时访问同一个资源。


线程同步的作用:

就是为了解决线程安全问题的方案

如何实现线程同步?

把共享资源进行上锁,每次只能一个线程进入访问完毕后,其他线程才能继续访问。


线程同步的方式有三种:

1.同步代码块

2.同步方法

3.lock显示锁 同步代码块


同步代码块

作用:把出现线程安全问题的核心代码给上锁,每次只能一个线程进入,执行完毕以后自动上锁,其他线程才可以进来执行。

格式:

synchronized(锁对象){
    //访问共享资源的核心代码
}

锁对象建议使用共享资源

在实例方法中建议使用this作为锁对象。此时this正好是共享资源!

在静态方法中建议使用类名.class字节码作为锁对象。

synchronized (this){
    if(this.money >= money){
        System.out.println(name+"来取钱,吐出:"+money);
        this.money -= money;
        System.out.println(name+"来取钱"+money+"成功,取钱后剩余:"+this.money;
    }else{
        System.out.println(name+"来取钱,余额不足,剩余"+this.money;
    }
}

//张三来取钱,吐出:10000
//张三取钱成功,取钱后剩余0
//李四来取钱,余额不足,剩余0

同步方法

作用:

把出现线程安全问题的核心方法给锁起来

每次只能使一个线程进入访问,其他线程必须在方法外面等待。

用法:

直接给方法加上一个修饰符 synchronized

public synchronized void ThreadDemo(){
    if(this.money >= money){
        System.out.println(name+"来取钱,吐出:"+money);
        this.money -= money;
        System.out.println(name+"来取钱"+money+"成功,取钱后剩余:"+this.money;
    }else{
        System.out.println(name+"来取钱,余额不足,剩余"+this.money;
    }
}

lock显示锁

java.util.concurrent.locks.Lock机制提供了比synchronized代码块和synchronized方法更广泛的锁操作,同步代码块/同步方法具有的功能Lock锁都有,除此之外更强大更方便

Lcok锁也称同步锁,加锁与释放锁方法化了,如下:

--public void lock()   //:加同步锁
--public void unlock() //:释放同步锁

实例:

//创建一把锁
private final Lock lock = new ReentrantLock();

lock.lock();        //上锁
try{
    if(this.money >= money){
        System.out.println(name+"来取钱,吐出:"+money);
        this.money -= money;
        System.out.println(name+"来取钱"+money+"成功,取钱后剩余:"+this.money;
    }else{
        System.out.println(name+"来取钱,余额不足,剩余"+this.money;
    }catch (Exception e){
        e.printStackTrace();
    }finally{
    lock.unlock();      //解锁
    }
}

分类: [Java基础]


在这里插入图片描述
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 为什么有线程安全问题? 当多个线程同时共享,同一个全局变量或静态变量,做写的操作时,可能会发生数据冲突问题,也就是...
    请收下章鱼君的膝盖阅读 1,131评论 0 0
  • title: 线程安全问题date: 2019/04/01 17:13 线程安全问题是由于多个线程同时操作同一全局...
    想54256阅读 993评论 0 0
  • 线程安全问题 本篇主要讲解 线程安全问题,演示什么情况下会出现线程安全问题,以及介绍了 Java内存模型 、vol...
    Aska小强阅读 163评论 0 0
  • 线程安全问题 两个窗口同时打印一张票的问题: 线程售票窗口1:抢到cpu资源开始执行run方法,拿到的票是44号...
    Hanks_Wei阅读 221评论 0 0
  • 16宿命:用概率思维提高你的胜算 以前的我是风险厌恶者,不喜欢去冒险,但是人生放弃了冒险,也就放弃了无数的可能。 ...
    yichen大刀阅读 7,787评论 0 4

友情链接更多精彩内容