关于线程安全和线程不安全我打算以举例子的方式去说,这样说的比较容易理解
问题:比如说全班去买票,那么整个班上的人不可以同时买到同一张票吧,应该是一个人对应一张票,即时你们是同一个地方的人,也不能买到一张票,所以在买票的高峰期就更不能出现这种情况了,
线程安全:
比如说五个人去上厕所,一次只能上一个人,把厕所门锁住,这样其他人就不能进来了,这就是线程安全,就是说其中一个线程在执行的时候,其他的线程在等待资源释放,不会发生共享一个资源的情况,不会发生两个人同时上厕所的情况,
这里提到了一个知识点:这就是锁
synchornized:用来锁住线程公有的资源,这个方法就是公有的,几个线程都在调用这个方法,
* 加上锁之后第一个线程在调用她的时候不会,其他的线程在等待资源释放,不会出现抢资源的情况,不会同时脉一张票,就是线程安全
* 举个例子:五个人上厕所,第一个人上厕所的时候其他的人不能进来上吧,所以是不是要把厕所给锁住了,synchronized就是锁’
* 其他人不能就来了;
* synchronized就是为了线程安全用的,所得是资源不是资源调用者
* 锁同步代码块或者同步方法;
* 锁块和锁方法的区别:
* 1:都是线程安全锁,可以解决并发问题
* 2:锁的范围不同,锁方法的范围大,锁块的范围小
以买票为例吧
package jucdemo;
import java.util.Random;
/**
* @author 邓亚非
*/
public class Sell {
int ticket;
public Sell() {
}
public Sell(int ticket) {
this.ticket = ticket;
}
/**
* 售卖票的方法
*
* @param window synchronized:用来锁住线程公有的资源,这个方法就是公有的,几个线程都在调用这个方法,
* 加上锁之后第一个线程在调用她的时候不会,其他的线程在等待资源释放,不会出现抢资源的情况,不会同时脉一张票,就是线程安全
* 举个例子:五个人上厕所,第一个人上厕所的时候其他的人不能进来上吧,所以是不是要把厕所给锁住了,synchronized就是锁'
* 其他人不能就来了;
* synchronized就是为了线程安全用的,所得是资源不是资源调用者
* 锁同步代码块或者同步方法;
* <p>
* 锁块和锁方法的区别:
* 1:都是线程安全锁,可以解决并发问题
* 2:锁的范围不同,锁方法的范围大,锁块的范围小
* <p>
* 同步:当多个线程同时使用一个资源时,会出现资源竞争的情况
*/
public synchronized void sell(String window) {
if (ticket > 0) {
System.out.println(window + "卖出了第" + (ticket--) + "张票");
}
try {
Thread.sleep(new Random().nextInt(500));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这里我们给方法加上了synchronized锁,就不会出现线程不安全的问题了
线程不安全:
理解了线程安全,就不难理解线程不安全了,是反过来的哈哈哈