package safe_sell_tickets;
/**
* 如何解决线程安全问题?在java中通过同步机制来解决
* 方法一:同步代码块
* synchronized(同步监视器){ -->不能包含代码多了,也不要包含代码少了
* //需要被同步的代码
* }
* 说明:①操作共享数据的代码,即为需要被同步的代码
* ②共享数据:多个线程共同操作的变量。比如:ticket就是共享数据
* ③同步监视器,俗称:锁。任何一个类的对象都可以充当锁。
* 要求:多个线程必须共用同一个锁
*
* 补充:在实现Runnable接口创建多线程的方式中,我们可以考虑用this来充当同步监视器
* 方法二:同步方法
* 如果操作共享数据的代码完整的声明在一个方法中,我们不妨将此方法声明同步的。
*
* 同步的方式,解决了线程的安全问题
* 操作代码时,只能有一个线程参与,其他线程等待。相当于是一个单线程的过程,效率低。
*
* @author LTH
* @date 2021/4/17 - 13:01
*/
class MyThread3 implements Runnable{
private int tickets = 100;
Object obj = new Object();
@Override
public void run() {
//对象可以是任意的,写this也可以,因为main方法中只new了一个My_Thread3的对象,是唯一的
synchronized (obj){
while(tickets > 0){
System.out.println(Thread.currentThread().getName() + tickets);
tickets--;
}
}
}
}
public class ThreadTest3 {
public static void main(String[] args) {
MyThread3 m3 = new MyThread3();
Thread w1 = new Thread(m3);
Thread w2 = new Thread(m3);
Thread w3 = new Thread(m3);
w1.setName("窗口1:");
w2.setName("窗口2:");
w3.setName("窗口3:");
w1.start();
w2.start();
w3.start();
}
}
同步代码块处理实现Runnable线程安全问题
最新推荐文章于 2024-07-23 21:37:49 发布