synchronized关键字解决继承Thread方式的线程的安全问题
还是拿抢茅台为例子:仓库就100台茅台,但是好多人去抢,如果防止同一瓶茅台被多次抢走,所以我们要注意线程的安全问题。
继承的Thread的方式创建线程的步骤
- 继承Thread类
- 重写Thread的run方法
- 调用继承类的start方法
当我们使用synchronized 时候,结构体的要传的参数
synchronized(锁){
方法的共同体
}
锁:即为一个对象,但是要保证多线程去使用的这个锁,也就是使用的这个对象必须是同一个对象,同一把锁。
方法的共同体:为线程去操作使用的重复的代码
代码实现:
声明一个Pepple类,继承Thread,并且重写了Run方法。
public class People extends Thread {
private static Object obj=new Object();
private static int nums= 100;
public void run(){
while(true){
synchronized (obj){
if (nums>0){
System.out.println(Thread.currentThread().getName()+":已经抢购了,剩余的数量为:"+nums);
nums--;
}else{
break;
}
}
}
}
}
在main方法中使用多次声明People的对象去调用start的方法。
public class MainGo {
public static void main(String[] args) {
People people = new People();
people.start();
People people1 = new People();
people1.start();
}
}
这里特别要注意的是。多次声明了People的对象,需要我们注意的事,
1、多次声明了People类,但是由于obj这个对象是static对象修饰的,不管我们要实力化多少static,obj都是唯一的。
2、为了保证总的数量唯一,我们也将num声明用static修饰,保证了总数不管是那个线程调用,都只会存在一份,并且会逐渐变化。
如果对于此处不熟悉的,可以去学习一下static关键字,以及单利模式。