我是靠谱客的博主 忧心小猫咪,最近开发中收集的这篇文章主要介绍java 线程安全和非线程安全,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、线程安全

所谓线程安全,就是指在多线程访问时数据时,采用加锁机制,当一个线程访问该类的某个数据时,就会进行保护,其他不相干的线程就不能够访问,除非该线程读取完毕,其他线程才可读取。这样就不会出现数据不一致或者数据污染。

线程安全保证了多线程同时操作同一个对象不会出现问题。

线程安全会使用很多synchronized关键字来进行同步控制,所以必然会导致性能大幅的降低。

二、非线程安全

线程不安全就是在运行中不提供数据访问保护,这样就可能出现多个线程先后更改数据,造成所得到的数据是脏数据。

非线程安全指多线程操作同一个对象可能会出现问题。

其他:

ArrayList是非线程安全的,Vector是线程安全的

HashMap是非线程安全的,HashTable是线程安全的

StringBuilder是非线程安全的,StringBuffer是线程安全的

ArrayList:底层是数组结构,查询快,增删慢

LinkedList:底层结构是链表,查询慢,增删快

线程安全实现

实例:

public class ThreadSafe
{
public static void main(String[] args)
{
HasSelf numself = new HasSelf();
threadA aThreadA = new threadA(numself);
aThreadA.start();
threadB bThreadB = new threadB(numself);
bThreadB.start();
}
}
class HasSelf
{
//private int num=0;
public void addI(String username)
{
try
{
int num = 0;
if (username.equals("a"))
{
num = 100;
System.out.println("a set over");
Thread.sleep(1);
}
else
{
num = 200;
System.out.println("b set over");
}
System.out.println(username + "num= " + num);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
class threadA extends Thread
{
private HasSelf numself;
public threadA(HasSelf numself)
{
super();
this.numself = numself;
}
@Override
public void run()
{
super.run();
numself.addI("a");
}
}
class threadB extends Thread
{
private HasSelf numself;
public threadB(HasSelf numself)
{
super();
this.numself = numself;
}
@Override
public void run()
{
super.run();
numself.addI("b");
}
}

执行结果:

a set over
b set over
anum= 100
bnum= 200

线程非安全:

注释sleep

结果:

a set over
anum= 100
b set over
bnum= 200

把//private int num=0;注释去掉,把int num=0注释掉

执行结果:

a set over
b set over
bnum= 200
anum= 200

注:多个线程共同访问一个对象中实例变量时,可能出现非线程安全,同时若线程访问多个实例变量,可能产生交叉情况。

 

 

 

最后

以上就是忧心小猫咪为你收集整理的java 线程安全和非线程安全的全部内容,希望文章能够帮你解决java 线程安全和非线程安全所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部