Java 多线程安全:哪段代码更安全?
第二段代码中的线程最安全。原因是在第二段代码中,创建了两个线程对象,但是这两个线程共享了同一个Ticket对象。而Ticket类中的sale()方法使用了synchronized关键字,确保了在同一时间只有一个线程能够访问sale()方法,避免了多线程并发访问时可能出现的数据竞争和不一致性问题。而第一段代码中,创建了两个Create1线程对象,每个线程对象都创建了一个新的Ticket对象,导致每个线程对象都拥有自己的锁,无法保证线程安全性。\n\n代码片段 1:\njava\npublic class Create1 extends Thread{\n @Override\n public void run(){\n // 线程执行的代码逻辑\n System.out.println("线程开始执行");\n try {\n Ticket ticket = new Ticket();\n while (ticket.number > 0) {\n ticket.sale();\n }\n Thread.sleep(1000); // 模拟线程执行耗时操作\n } catch (InterruptedException e) {\n e.printStackTrace();\n }\n System.out.println("线程执行结束");\n }\n\n public static void main(String[] args) {\n Create1 create1 = new Create1();\n create1.start();\n Create1 create2 = new Create1();\n create2.start();\n }\n static class Ticket {\n //票数\n private int number = 45000;\n //操作方法:卖票\n public synchronized void sale() {\n //判断:是否有票\n if(number > 0) {\n\n System.out.println(Thread.currentThread().getName()+" : "+(number--)+" "+number);\n }\n }\n }\n}\n\n\n代码片段 2:\njava\npublic class Test1 {\n /*\n synchronized会自动释放锁。当一个线程执行完synchronized代码块或方法时,它会释放锁,\n 使其他线程能够获取该锁并执行相应的代码。这种自动释放锁的机制可以确保在同一时间只有一个线程能够访问被synchronized保护的代码块或方法,\n 从而避免了多线程并发访问时可能出现的数据竞争和不一致性问题。\n */\n public static void main(String[] args) {\n Ticket ticket = new Ticket();\n Thread thread1 = new Thread(() -> {\n while (ticket.number > 0) {\n ticket.sale();\n }\n });\n Thread thread2 = new Thread(() -> {\n while (ticket.number > 0) {\n ticket.sale();\n }\n });\n thread1.start();\n thread2.start();\n }\n static class Ticket {\n //票数\n private int number = 45000;\n //操作方法:卖票\n public synchronized void sale() {\n //判断:是否有票\n if(number > 0) {\n\n System.out.println(Thread.currentThread().getName()+" : "+(number--)+" "+number);\n }\n }\n }\n}\n
原文地址: https://www.cveoy.top/t/topic/p7u0 著作权归作者所有。请勿转载和采集!