网站版建设/提供seo顾问服务适合的对象是
大多数多线程应用中需要码农们自己去额外解决一些问题,这些问题在单线程程序中并不存在,尤其是线程安全性问题,由于不同的线程能共享相同的内存和数据,一个线程完全可以去破坏另一个线程的数据,尤其是在一些没有内存保护机制的操作系统中,可能破坏整个系统的数据。因此,多线程程序中,必须非常注意对资源的使用。
一般来说,每个线程只有在确保资源不能被改变或者自身对资源具有独占权时,这个资源才是安全的,也就是所谓的线程安全,如果一个线程使用某个能被修改的资源,并且在它使用这个资源的同时,还有其他线程也能使用这个资源,那么这个资源就是不安全的,也就是所说的线程不安全。这里所说的资源,可以是程序中的变量,磁盘上的文件,数据库的数据,各类数据连接等等可以共享的资源,这里所说的安全,可以是变量的肆意修改,文件损坏,各种数据内容出现不期望的变化等待。
事实上也很容易理解。两个人同时修改一个文件,不采取某种措施的情况下怎么能不会出现问题?
用一段简单的示例来说明问题吧
public static void main(String[] arg){
Thread thread1=new Thread(new Runnable() {
@Override
public void run() {
int count=0;
while(count<10){
System.out.print("1");
count++;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread thread2=new Thread(new Runnable() {
@Override
public void run() {
int count=0;
while(count<10){
System.out.print("2");
count++;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread thread3=new Thread(new Runnable() {
@Override
public void run() {
int count=0;
while(count<10){
System.out.print("3");
count++;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
Thread thread4=new Thread(new Runnable() {
@Override
public void run() {
int count=0;
while(count<10){
System.out.print("4");
count++;
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
});
thread1.start();
thread2.start();
thread3.start();
thread4.start();
}
示例中用了四个线程,分别在控制台打印10次数字1,2,3,4。运行后的某次结果如下:
2134213421432143214334124321341243123421
再次运行,又是这样
2314234123142314231423412341234123142341
程序运行的结果杂乱无规律,这就是多线程程序的特征。这个程序是线程不安全的。如果我们把控制台当作一个文件来看,我们希望得到的结果应该是这样:
1111111111222222222233333333334444444444
我们希望自己的内容能正确的被记录,同时也不希望破坏别人的内容。在这里,system.out就是一个共享的资源,四个线程都同时使用这个资源,而且没有采用任何保护措施,这在实际业务中是非常危险的。
线程通过共享内存,文件句柄和其他资源,使得程序更加高效,尤其是在一些服务端程序中,多线程能大幅度提升服务器性能。遗憾的是,任何事情都有两面性,多线程也不例外,它带来了程序的复杂性,它让代码变得难于理解,难于追踪问题,它需要你谨慎的去使用资源。
==========================================================================关注微信公众号 “Java技术”,可以实时获取有价值的技术文章推送。
"Java技术"交流群:245130488
"Java软件工程师培训"系列课程正式推出,助你自学成才,进入IT行业。