美文网首页
Java多线程安全问题

Java多线程安全问题

作者: 海人为记 | 来源:发表于2018-07-23 09:30 被阅读12次

什么情况下会产生线程安全问题?

同时满足以下两个条件时:

  • 多个线程在操作共享的数据
  • 操作共享数据的线程代码有多条
    共享数据存在被并发修改的可能,就会导致线程安全问题的产生。

线程安全问题解决思路

将多条操作共享数据的线程代码封装起来,当有线程在执行这些代码的时候,其他线程不可以参与运算。
当前线程把这些代码都执行完毕后,其他线程才可以参与运算。
使用Java中同步代码块可以解决这个问题。

synchronized(对象) {
需要被同步的代码;}

这个对象一般称为同步锁。
同步的前提:同步中必须有多 个线程并使用同一个锁。
同步的好处:解决了线程的安全问题。
同步的弊端:相对降低了效率,因为同步外的线程的都会判断同步锁。

Thread thread1 = new Thread() {
            @Override
            public void run() {
                while(true) {
                    synchronized (Class.class) {
                        if(ticket>0) {
                            ticket--;
                        } else {
                            break;
                        }
                    }
                }
            }
        };
Thread thread2 = new Thread() {
            @Override
            public void run() {
                while(true) {
                    synchronized (Class.class) {
                        if(ticket>0) {
                            ticket--;
                        } else {
                            break;
                        }
                    }
                }
            }
        };
thread1.start();
thread2.start();

注意事项:使用同一把锁的代码才能实现同步;没有获取到锁的线程即使得到了cpu的执行权,也不能运行;尽量减少锁的范围,避免效率低下;锁可以加在任意类的代码中或方法上。

死锁

使用同步的多个线程同时持有对方运行时所需要的资源
多线程同步时,多个同步代码块嵌套,很容易出现死锁
锁的嵌套越多,越容易造成死锁的情况
死锁的情况

private static String s1 = "筷子左";
private static String s2 = "筷子右";

public static void main(String[] args) {
    new Thread() {
        public void run() {
            while(true) {
                synchronized(s1) {
                    System.out.println(getName() + "...拿到" + s1 + "等待" + s2);
                    synchronized(s2) {
                        System.out.println(getName() + "...拿到" + s2 + "开吃");
                    }
                }
            }
        }
    }.start();
    
    new Thread() {
        public void run() {
            while(true) {
                synchronized(s2) {
                    System.out.println(getName() + "...拿到" + s2 + "等待" + s1);
                    synchronized(s1) {
                        System.out.println(getName() + "...拿到" + s1 + "开吃");
                    }
                }
            }
        }
    }.start();
}
image

相关文章

  • volatile关键字

    线程安全问题 Java多线程带来的一个问题是数据安全问题,判断一段Java代码是否有线程安全问题可从以下几点入手:...

  • java多线程(壹)——线程与锁

    线程与线程安全问题 所有的线程安全问题都可以概况为三个点:原子性,可见性、有序性——————by Java多线程编...

  • 同步监视器锁定的释放问题

    在任何编程语言中,事关线程安全问题非常重要,而同步监测器是解决java多线程安全问题的关键,关于监测器锁定...

  • 关于AtomicInteger

    AtomicInteger JAVA原子操作的Interger类, 主要为解决多线程线程安全问题,今天拿来测试一下...

  • Java并发之synchronized

    一、前言序章   Java因为实现的是共享数据模型,在多线程操作共享数据时,会引起线程安全问题。Java为了解决线...

  • 多线程基础(三):synchronized关键字及java内存模

    [toc] 1.线程安全问题 在前面了解过一些java多线程基础之后,现在,我们用多线程来解决一个实际问题。假定每...

  • Java多线程安全问题

    什么情况下会产生线程安全问题? 同时满足以下两个条件时: 多个线程在操作共享的数据 操作共享数据的线程代码有多条共...

  • java多线程安全问题

    Java 每次请求controller都是唯一的拦截器也是唯一的不同方法间共享的变量会存在多线程安全问题 并发请求...

  • 1-引入synchronized锁

    引入 线程安全问题 在java的多线程的编程中,经常出现线程安全的问题,主要就在于正确性:即多线程对临界资源进行访...

  • java 高级特性之线程安全

    上一节我们总结了java多线程,这一节我们看看多线程安全问题。 一. 内存模型 1. 现代计算机内存模型 计算机在...

网友评论

      本文标题:Java多线程安全问题

      本文链接:https://www.haomeiwen.com/subject/trtcmftx.html