线程的生命周期
线程安全问题
* 1.问题一:卖票过程中出现重票,错票问题
* 2.问题出现原因:线程在操作过程中,其他线程也参与进来;
* 3.解决:当一个线程操作时,其他线程不能进来;
* 4.在Java中我们通过同步机制,来解决线程安全问题
* 方式一:同步代码块
* synchronized(同步监视器){
* 需要被同步的代码(操作共享数据的代码)
* }
* 同步监视器:俗称‘锁’任何一个对象都可以作为锁(多个线程必须要用同一个锁)
* 在实现接口的创建方式中,我们可以考虑this当监视器。
* 在继承类的创建方式中,不能用this充当,考虑使用当前类充当同步监视器
*
* 方式二:同步方法
* 使用同步方法解决实现接口类的线程安全问题
* public synchronized void show(){//同步监视器:this
* 操作共享数据的代码
* }
* 使用同步方法处理继承类的创建的线程安全问题
* public static synchronized void show(){//当前对象
*
* }
* 5.解决了安全问题但是同步代码段相当一个单线程;
6.使用同步机制将单例模式中的懒汉式改写成线程安全的
原懒汉模式
//懒汉式
class BankText1{
private BankText1() {//私有化类的构造器
}
private static BankText1 instance=null;//声明类的对象,不初始化
//提供公共静态方法,返回类的对象(可以直接用类名调用)
public static BankText1 getinstance(){
if(instance==null) {//判断是否存在对象,如果不存在则创建一个,存在则直接返回对象;
instance = new BankText1();
}
return instance;
}
}
使用同步代码块修改之后线程安全的懒汉式单例模式
//懒汉式
class BankText1{
private BankText1() {//私有化类的构造器
}
private static BankText1 instance=null;//声明类的对象,不初始化
//提供公共静态方法,返回类的对象(可以直接用类名调用)
public static BankText1 getinstance(){
if(instance==null) {//如果已经创建对象,不用进入同步代码块直接返回已创建对象
synchronized (Bank.class) {
if (instance == null) {//判断是否存在对象,如果不存在则创建一个,存在则直接返回对象;
instance = new BankText1();
}
}
}
return instance;
}
}