线程安全
解决线程安全问题的方式一:同步块
synchronized(同步监视器){
// 需要被同步的代码
}
当同步方法块在继承Extends类的类里时,可以如下写法
synchronized(类.class){//同步监视器:当前类本身,类对象
// 需要被同步的代码
}
1.操作共享数据的代码,即为需要被同步的代码。 -->不能包含代码多了,也不能包含代码少了。
2.共享数据:多个线程共同操作的变量。比如:ticket就是共享数据。
3.同步监视器,俗称:锁。任何一个类的对象,都可以充当锁。
要求:多个线程必须要共用同一把锁。
补充:在实现Runnable接口创建多线程的方式中,我们可以考虑使用this充当同步监视器。
解决线程安全问题的方式二:同步方法
如果操作共享数据的代码完整的声明在一个方法中,我们不妨将此方法声明同步的。
该方法在实现Runnable接口的类里
private synchronized void show(){//同步监视器:this
//需要被同步的代码
}
该方法在继承Extends类的类里
private static synchronized void show(){//同步监视器:当前类本身,类对象
//需要被同步的代码
}
解决线程安全问题的方式一:Lock锁
使用方法
//调用锁定方法lock()
lock.lock();
{
//操作共享数据的代码,既需要被同步的代码
}
//调用解锁方法:unlock()
lock.unlock();
1.synchronized 与 Lock的异同?
相同:二者都可以解决线程安全问题
不同:synchronized机制在执行完相应的同步代码以后,自动的释放同步监视器
Lock需要手动的启动同步(lock()),同时结束同步也需要手动的实现(unlock())
死锁
死锁:不同的线程分别占用对方需要的同步资源不放弃,都在等待对方放弃自己需要的同步资源,就形成了线程的死锁