多线程之不共享数据和共享数据

我们在设计线程的时候,有时候希望他共享数据,有时候又希望不,那么这两种情况究竟怎么做呢?

  • 不共享数据

不共享数据就是每个都是独立的线程,再去调自己的start方法就可以不共享数据了,下面看下代码。

public class NotShareData extends Thread {

private int count=5;

public NotShareData(String name){

super();

this.setName(name);

}

@Override

public void run(){

super.run();

while(count>0){

count--;

System.out.println(Thread.currentThread().getName()+"计算的count="+count);

}

}

}

接下来看下测试方法。

NotShareData nsd1=new NotShareData("1");

NotShareData nsd2=new NotShareData("2");

NotShareData nsd3=new NotShareData("3");

nsd1.start();

nsd2.start();

nsd3.start();

这里实例化了三个线程,通过调用每个线程的start方法之后,就可以不共享数据了,下面看下结果。

多线程之不共享数据和共享数据

不共享数据结果

  • 共享数据

共享数据的情况就是多个线程可以访问同一个对象。

public class ShareData extends Thread {

private int count=5;

@Override

public void run(){

super.run();

count--;

System.out.println(Thread.currentThread().getName()+"计算的count="+count);

}

}

这里不需要用while循环,因为我们是要多个线程一起访问。

下面看下测试方法。

ShareData sd=new ShareData();

Thread t1=new Thread(sd,"1");

Thread t2=new Thread(sd,"2");

Thread t3=new Thread(sd,"3");

Thread t4=new Thread(sd,"4");

Thread t5=new Thread(sd,"5");

t1.start();

t2.start();

t3.start();

t4.start();

t5.start();

这里调用的是Thread方法构造函数

多线程之不共享数据和共享数据

调用的构造函数

所以这里五个线程调用的都是同一个对象,就做到了共享数据了。下面看下结果

多线程之不共享数据和共享数据

共享数据的结果

这里可以看到,共享数据的一个问题,线程安全问题。其实在JVM中,i--操作是要分为三部分的,1.取原有的i值2.计算i-1 3.对i进行赋值,那么多个线程都在访问这个操作的话,肯定会出现线程安全的问题,所以在run方法前面要加上synchronized关键字就可以了。

通过在run方法前加入synchronized关键字,使多个线程在执行run方法时,以排队的方式进行处理吗。当一个线程调用run前,先判断run方法有没有被上锁,如果上锁,说明其他线程正在调用run方法,必须等待其他线程对run方法结束调用之后才可以执行run方法。

synchronized可以在任意对象及方法上加锁,而加锁的这段代码称为"互斥区"或“临界区”。

今天就到这里 喜欢的关注一波~~谢谢大家观看。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值