下周将如何优化企业网站的HTML建设?
摘要:html 网站建设中,企业网站下周,厚街手机网站制作,php租车网站源码JAVA同步代码块 & 同步方法 为了解决多线程操作共享数据时产生的安全问题 例如以下代码 if (ticket < 0) { 卖完了
html 网站建设中,企业网站下周,厚街手机网站制作,php租车网站源码JAVA同步代码块 同步方法
为了解决多线程操作共享数据时产生的安全问题
例如以下代码
if (ticket 0) {// 卖完了break;
} else {ticket--;System.out.println(Thread.currentThread().getName() 在卖票#xff0c;还剩下 ticket 张)…JAVA同步代码块 同步方法
为了解决多线程操作共享数据时产生的安全问题
例如以下代码
if (ticket 0) {// 卖完了break;
} else {ticket--;System.out.println(Thread.currentThread().getName() 在卖票还剩下 ticket 张);
}如果两个线程同时执行以上方法同时访问或修改共享的变量ticket就有可能会出现安全问题。
例如
出现重复票
窗口三在卖票还剩下98张
窗口一在卖票还剩下98张
窗口一在卖票还剩下96张
窗口三在卖票还剩下95张
窗口二在卖票还剩下95张原因几个线程可能同时执行System.out.println(Thread.currentThread().getName() 在卖票还剩下 ticket 张);
出现负数票
窗口一在卖票还剩下0张
窗口三在卖票还剩下-1张原因两个线程都在执行else语句前检查了ticket是大于0的。
JAVA中可以使用同步代码块和同步方法来解决以上问题。
同步代码块
为了解决以上问题可以使用同步代码块实现锁定多条语句以独立操作共享数据。
格式
synchronized(任意对象) {多条语句操作共享数据的代码
}需要对象作为一个锁只要有一个线程进去执行代码了这个对象就会被锁住。 当线程执行完出来了才会自动为这个对象解锁。 若对象被锁住了线程就无法继续执行直到这个对象被解锁。
因此为了使只能同时有一个线程执行语句只能是同一个对象作为synchronized的参数。
相当于一个房间只有一个门有一个线程进去了就会锁上门其他线程进不去。完成后再出门解锁。 若多个线程synchronized的参数是几个不同的对象就相当于一个房间有几个门各自都可以通过自己的门进出起不到隔离的作用。
修改后的代码如下
public class Ticket implements Runnable {// 票的对象private int ticket 100;private Object obj new Object();public void run() {while (true) {try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (obj) {if (ticket 0) {// 卖完了break;} else {ticket--;System.out.println(Thread.currentThread().getName() 在卖票还剩下 ticket 张);}}}}
}public class demo {public static void main(String[] args) {Ticket ticket new Ticket();Thread t1 new Thread(ticket);Thread t2 new Thread(ticket);Thread t3 new Thread(ticket);t1.setName(窗口一);t2.setName(窗口二);t3.setName(窗口三);t1.start();t2.start();t3.start();}
}同步方法
与同步代码块不同的是同步方法不需要指定锁对象而且同步方法可以锁住方法中所有代码故同时只能有一个线程运行同步方法中的代码。
