线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。
线程不安全就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据
这里举个非线性安全的例子:
public static void main(String[] args) throws InterruptedException {
Mythread thMythread=new Mythread();
final Thread thread1=new Thread(thMythread);
Thread thread2=new Thread(thMythread);
Thread thread3=new Thread(thMythread);
Thread thread4=new Thread(thMythread);
Thread thread5=new Thread(thMythread);
thread1.start();
thread2.start();
thread3.start();
thread4.start();
thread5.start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
Thread.sleep(100);
System.out.println(thread1.isAlive());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}).start();
}
class Mythread extends Thread{
private int sharedate=10;
@Override
public void run() {
// TODO Auto-generated method stub
System.out.println(--sharedate);
}
}
运行结果是:
如果你学过操作系统,你就会发现Mythread的sharedata是个共享区呀,怎么能不加锁呢,而在java中有个synchronized的东西,我只需要在run方法加synchronized,就可以实现线程安全了,而添加了这个synchronized 就相当于为这个方法加锁,当有一个线程运行这个方法的时候,其他线程必须要等待这个线程执行完才能执行这个方法。
网友评论