多线程_同步代码块的方式解决线程安全问题

来源:互联网 发布:推理游戏 知乎 编辑:程序博客网 时间:2024/05/18 04:09
package cn.itcast_09;/* * 如何解决线程安全问题呢? *  * 要想解决问题,就要知道哪些原因会导致出问题:(而且这些原因也是以后我们判断一个程序是否有线程安全问题的标准) * A:是否是多线程环境 * B:是否有共享数据 * C:是否有多条语句操作共享数据 * 那这个售票程序有没有上面的问题呢? * A:是否是多线程环境是(t1,t2,t3) * B:是否有共享数据是(int Tickets=100) * C:是否有多条语句操作共享数据是(if(Tickets>0){Tickets--}) *  * 由些可见售票程出现问题是正常的,因为它满足出问题的条件。 * 如何解决问题呢? * A和B我们改变不了,我们只能想办法去把C改变一下。 * 思想: * 把多条语句操作共享数据的代码给包成一个整体,让某个线程在执行的时修,别人不能来执行。 *  * 该怎么包呢?但是Java给我们提供了:同步机制。 *  * 同步代码块: * synchronized(对象){ * 需要同步的代码; * } * synchronized(深扣买丝特) *  * A:对象是什么呢? * 我们可以随便创建一个对象试试 * B:需要同步的代码是哪些呢? * 把多条语句操作共享数据的代码给包起来  *  * 注意: * 同步可以解决安全问题的根本原因就在那个对象上。该对象如同锁的功能。 * 多线程必须是同一把锁。 */public class SellTicketDemo {public static void main(String[] args) {// 创建资源对象SellTicket st = new SellTicket();// 创建线程对象Thread t1 = new Thread(st, "窗口1");Thread t2 = new Thread(st, "窗口2");Thread t3 = new Thread(st, "窗口3");// 启动线程t1.start();t2.start();t3.start();}}


package cn.itcast_09;public class SellTicket implements Runnable {// 定义100张票private int tickets = 100;// 创建锁对象private Object obj = new Object();// @Override// public void run() {// while (true) {// if (tickets > 0) {// try {// Thread.sleep(100);// } catch (InterruptedException e) {// // TODO Auto-generated catch block// e.printStackTrace();// }// System.out.println(Thread.currentThread().getName() + "正在出售第"// + (tickets--) + "张票");//// }// }//// }@Overridepublic void run() {while (true) {synchronized (obj) {// 把多条语句操作共享数据的代码给包起来if (tickets > 0) {try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+ "正在出售第" + (tickets--) + "张票");}}}}}


0 0
原创粉丝点击