package deep;
//问题:出现重票和错票(即线程安全问题)
//原因:某个线程操作车票的过程中,未完成时其它线程就参与进来,也操作
//如何解决:a操作完才允许其它线程加入
//在java中通过同步机制
/*一、同步代码块时现Runnable接口
synchornized(同步监视器){
需要被同步的代码(操作共享数据的代码)
}
1.共享数据为多个线程共同操作的变量 如ticket
2.同步监视器:俗称锁,任何一个类的对象
要求:多个线程必须共用同一把锁
补充:在实现Runnable接口创建多线程,可以考虑用this来充当同步监视器
在继承Thread类创建多线程时,最好不用this,可以考虑使用当前类充当监视器
*/
class Window1 implements Runnable {
private int ticket = 100;
Object obj = new Object(); //此处不需要static
//线程里跑的东西
public void run() {
while (true) {
synchronized (obj) { //也可以使用Window.class 类可以作为一个对象出现
if (ticket > 0) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + ":卖票:票号为:" + ticket);
ticket--;
} else {
break;
}
}
}
}
}
public class WindowTest1 {
public static void main(String[] args) {
Window1 w = new Window1(); //创建一个对象
Thread t1 = new Thread(w); //三个构造器使用同一个对象
Thread t2 = new Thread(w);
Thread t3 = new Thread(w);
t1.setName("窗口1");
t2.setName("窗口2");
t3.setName("窗口3");
t1.start();
t2.start();
t3.start();
}
}
//实现Thread类
package deep;
class Window extends Thread {
private static int ticket = 100 ; //三个线程共享静态变量,避免卖出300张票
private static Object object = new Object(); //此处需要static
public void run(){
while (true) {
synchronized (Window.class) { //也可以使用类锁对象Window.class
if (ticket > 0) {
System.out.println(getName() + ":卖票:票号为:" + ticket);
ticket--;
} else {
break;
}
}
}
}
}
public class WindowTest {
public static void main(String[] args) {
Window t1 = new Window() ;
Window t2 = new Window() ;
Window t3 = new Window() ;
t1.setName("窗口一");
t2.setName("窗口二");
t3.setName("窗口三");
t1.start();
t2.start();
t3.start();
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!