線程安全就是多線程訪問時,采用了加鎖機制,當一個線程訪問該類的某個數據時,進行保護,其他線程不能進行訪問直到該線程讀取完,其他線程才可使用。不會出現數據不一致或者數據污染。
線程不安全就是不提供數據訪問保護,有可能出現多個線程先后更改數據造成所得到的數據是臟數據
這里舉個非線性安全的例子:
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 就相當于為這個方法加鎖,當有一個線程運行這個方法的時候,其他線程必須要等待這個線程執行完才能執行這個方法。