什么是线程安全和线程不安全
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
当对一个复杂对象进行某种操作时,从操作开始到操作结束,被操作的对象往往会经历若干非法的中间状态。调用一个函数(假设该函数是正确的)操作某对象常常会使该对象暂时陷入不可用的状态(通常称为不稳定状态),等到操作完全结束,该对象才会重新回到完全可用的状态。
如果其他线程企图访问一个处于不可用状态的对象,该对象将不能正确响应从而产生无法预料的结果,如何避免这种情况发生是线程安全性的核心问题。
扩展资料:
简单类比
线程安全性问题跟外科医生做手术有点象,尽管手术的目的是改善患者的健康,但医生把手术过程分成了几个步骤,每个步骤如果不是完全结束的话,都会严重损害患者的健康。
想想看,如果一个医生切开患者的胸腔后要休三周假会怎么样?然而单线程的程序中是不存在这种问题的,因为在一个线程更新某对象的时候不会有其他线程也去操作同一个对象。
(除非其中有异常,异常是可能导致上述问题的。当一个正在更新某对象的线程因异常而中断更新过程后,再去访问没有完全更新的对象,会出现同样的问题)
参考资料来源:百度百科-线程安全性
参考资料来源:百度百科-线程安全
1、线程安全:
指多个线程在执行同一段代码的时候采用加锁机制,使每次的执行结果和单线程执行的结果都是一样的,不存在执行程序时出现意外结果。
2、线程不安全:
是指不提供加锁机制保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
举例说明:假设售票系统有1000张票,A和B同时来买票,如果是线程不安全,那么可能售票系统可能出现1000-1去同时执行的情况,最终结果是A和B都买完后剩下999张票,而不是998张。
扩展资料
1、引起线程安全问题的原因:
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
2、解决多线程并发访问资源安全问题的方法:
(1)synchronized
synchronized关键字,就是用来控制线程同步的,保证我们的线程在多线程环境下,不被多个线程同时执行,确保我们数据的完整性,使用方法一般是加在方法上。
(2)Lock
Lock是在Java1.6被引入进来的,Lock的引入让锁有了可操作性,是指我们在需要的时候去手动的获取锁和释放锁,甚至我们还可以中断获取以及超时获取的同步特性,从使用上synchronized使用起来比Lock更方便。
参考资料:百度百科:线程安全
1、线程安全是:
如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
2、线程不安全:
就是不提供数据访问保护,有可能出现多个线程先后更改数据造成所得到的数据是脏数据。
在多个线程同时访问同一个对象时会发生数据错误 不完整等情况时 那就是线程不安全,不会发生上续错误时是线程安全的,一般采用锁机制。
扩展资料:
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
线程安全问题都是由全局变量及静态变量引起的。
若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行写操作,一般都需要考虑线程同步,否则的话就可能影响线程安全。
参考资料:百度百科-线程安全
2019-04-16
java
这个方法写在用户自定义类中,继承了Runnable接口。
不规范,省略了一些条条框框。
public int count = 0; //声明并定义全局变量count,被两个线程共享。
public thread_job(){
int i;
for(;i<20;i++){
System.out.println("count = " + count);
count ++;
}
}
这是主类,用来运行测试的类。
public static void main(String[] args){
MyThread myThread1 = new MyThread();
MyThread myThread2 = new MyThread();
Thread thread1 = new Thread(myThread1);
Thread thread2 = new Thread(myThread2); //创建了两个自定义线程任务
}
=================
自己在电脑上敲上面的代码,可能会得到两个完全一样的数字(比如12、12之类)。上面是一个线程不安全的例子。其关键在于,count是全局变量,能够被thread1访问,也能被thread2访问,在修改count值的时候可能会产生冲突。
===============
java本身提供了synchronized关键字,确保线程同步。避免了线程冲突问题。
两点提请注意:
1. synchronized锁的是括号里的对象,而不是代码;
2. 对于非静态的synchronized方法,锁的是对象本身也就是this。
如果是Java1.6+,还可以使用Lock,等技术进行加锁解锁操作,但是没有synchronized来得方便。