java验证多线程_java---教你怎么判断多线程是否安全

本文通过一个简单的Java多线程示例,阐述了如何找出并解决线程安全问题。主要步骤包括识别多线程运行的代码、确定共享数据以及明确操作共享数据的语句。针对发现的线程不安全问题,提出了使用同步块或同步函数的解决策略,以确保线程安全,同时提到了同步带来的性能损耗问题。
摘要由CSDN通过智能技术生成

多线程不安全,主要因为cpu分配机制,谁获得了cpu谁就能执行,因此造成了线程的不安全.

那么,如何找出问题呢?

1.明确哪些代码是多线程运行的代码,

2.明确共享数据

3.明确多线程运行代码中哪些语句是操作共享数据.

根据以上三部.下面看例子,

package com.niuli.develop;

public class Test {

public static void main (String [] args) {

Cus c = new Cus();

new Thread(c).start();

new Thread(c).start();

}

}

class Bank{

private int sum = 0;

public void add(int n) {

sum = sum + n;

System.out.println("sum= "+sum);

}

}

class Cus implements Runnable{

Bank b = new Bank();

@Override

public void run() {

for (int i = 0; i < 3; i++) {

b.add(100);

}

}

}

很简单的例子,

首先第一步,找到多线程运行的代码

也就是run方法里面的代码

for (int i = 0; i < 3; i++) {

b.add(100);

}

另外这里用到了Add方法,所以add也算

public void add(int n) {

sum = sum + n;

System.out.println("sum= "+sum);

}

第二步,找到共享数据

Bank b = new Bank();

private int sum = 0;

第三步,明确多线程使用的共享数据.

首先对于数据b就一条语句使用了这个共享变量,因此不会出现线程不安全,但是对于sum,有两条语句使用的,所以就会出现线程安全问题,

解决办法,同步块

Object obj = new Object();

public void add(int n) {

synchronized (obj) {

sum = sum + n;

System.out.println("sum= "+sum);

}

}

或者,同步函数

public synchronized void add(int n) {

sum = sum + n;

System.out.println("sum= "+sum);

}

以上就是线程安全的解决办法,同步机制虽然游侠,但是带来了一定的性能损耗,所以,对操作共享数据的部分执行同步,尽量减少这种损耗

补充:

如果同步函数是静态的,那么使用的锁就必须是所在类的字节码文件对象,也就是 类名.class,解释来说,静态是和类一起加载的,所以在静态加载的时候是不可能有object的对象,所以锁就必须用在静态加在之前的一个对象.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值