Java多线程:数据共享以及线程安全问题

  • 多线程的线程安全问题一直是很多人都在谈论的问题,下面就该问题来发表一下我所学习到以及对该方面的见解.

  • 说到线程安全问题,那就需要先说一下线程中的数据共享,尤其是在多个线程之间进行交互时尤为重要.
    - 不共享的情况属于多个线程对数据操作时,数据之间是不共通,互不影响的.
    - 共享类似于多个线程共通操作一个私有变量,任何一个线程都可以对其进行操作,例如一个线程对这个数据进行增添,而其他的线程对这个数据进行删减.因此也就会引发线程安全问题.

    • 处理这种线程安全问题的方法就是通过在run方法前加入Synchronized关键字,使多个线程在执行run方法时,以排队的方式进行处理,类似于对该方法进行了排队,在执行该方法前先判断是否有线程在执行该方法,如果有,那就等待执行完毕后在执行,每次只能有一个进行执行.
    • synchronized可以在任意对象及方法上加锁,加锁的这段代码成为”互斥区”或”临界区”
  • 非线程安全主要是指多个线程对同一个对象的同一个实例变量进行操作时会出现值被更改,值不同步的问题,从而影响程序的执行流程.

    • 在参考资料时,有一个案例是,println()方法与i–或i++联合使用时,有可能会出现异常情况,我将其摘取下来供大家参考:
  • 代码如下:

package com.demo2;

public class ThreadDemo1 implements Runnable{

    @Override
    public void run() {
        System.out.println("i : "+(i--)+"  __  ThreadName :"+Thread.currentThread().getName());
    }
    private Integer  i=5;

    public static void main(String[] args) {
        ThreadDemo1 thread = new ThreadDemo1();
        Thread thread1 = new Thread(thread);
        Thread thread2 = new Thread(thread);
        Thread thread3 = new Thread(thread);
        Thread thread4 = new Thread(thread);
        Thread thread5 = new Thread(thread);
        thread1.start();
        thread2.start();
        thread3.start();
        thread4.start();
        thread5.start();
    }
}

运行结果

测试目的:虽然println()方法在内部是同步的,但是i–的操作却是在进行println() 之前发生的,所以有发生线程安全的问题概率.

为了防止非线程安全问题,还是继续使用同步方法吧~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值