线程2——并发问题
编辑器加载中...
1 package com.test2;
2
3 public class Demo10_5 {
4
5 /**
6 * @param args
7 */
8 public static void main(String[] args) {
9
10 TicketWindow ticketWindow1 = new TicketWindow();
11 // TicketWindow ticketWindow2 = new TicketWindow();
12
13 Thread thread1 = new Thread(ticketWindow1);
14 Thread thread2 = new Thread(ticketWindow1);
15
16 thread1.start();
17 thread2.start();
18 }
19
20 }
21
22 // 售票窗口类
23 class TicketWindow implements Runnable {
24 // 一共有2千张票
25 // private static int nums = 10;
26 private int nums = 10;
27
28 @Override
29 public void run() {
30 // TODO Auto-generated method stub
31 while (true) {
32 try {
33 Thread.sleep(1000);
34 } catch (Exception e) {
35 // TODO: handle exception
36 }
37 if (nums > 0) {
38 // 显示售票信息:
39 // 当前线程的名字:Thread.currentThread().getName()
40 System.out.println(Thread.currentThread().getName() + "还剩下"
41 + nums + "张票");
42 --nums;
43 } else {
44 System.out.println("票已经卖完!");
45 break;
46 }
47 }
48 }
49 }
结果:
Thread-1还剩下10张票
Thread-0还剩下10张票
Thread-1还剩下8张票
Thread-0还剩下7张票
Thread-0还剩下6张票
Thread-1还剩下6张票
Thread-1还剩下4张票
Thread-0还剩下4张票
Thread-0还剩下2张票
Thread-1还剩下2张票
票已经卖完!
票已经卖完!
java线程的同步。
java任意类型的对象都有一个标志位该标志位具有0,1两种状态,其开始状态为1.当某个线程执行了synchronized(object)语句后,object对象的标志位变为0状态,知道执行完整个sysnchronized语句中的代码块后,该对象的标志位又回到1状态。
当一个线程执行到synchronized(object)语句的时候,先检查object对象的标志位,如果为0状态,表明已经有另外的线程正在执行synchronized包括的代码,那么已经有另外的线程暂时阻塞,让出cpu资源,直到另外的线程执行完相关的代码快,并将object对象的标志位变为1状态,这个线程的阻塞就被取消了,线程能继续运行,该线程有将object的标志位为0状态,防止其他线程在进入相关的同步代码快中
代码如下:
package com.test2;
public class Demo10_5 {
/**
* @param args
*/
public static void main(String[] args) {
TicketWindow ticketWindow1 = new TicketWindow();
// TicketWindow ticketWindow2 = new TicketWindow();
Thread thread1 = new Thread(ticketWindow1);
Thread thread2 = new Thread(ticketWindow1);
thread1.start();
thread2.start();
}
}
// 售票窗口类
class TicketWindow implements Runnable {
// 一共有2千张票
// private static int nums = 10;
private int nums = 1000;
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
// 保证if else 的原子性[同步代码快] this是对象锁
synchronized (this) {
if (nums > 0) {
// 显示售票信息:
// 当前线程的名字:Thread.currentThread().getName()
System.out.println(Thread.currentThread().getName() + "还剩下"
+ nums + "张票");
try {
Thread.sleep(1000);
} catch (Exception e) {
// TODO: handle exception
}
nums--;
} else {
System.out.println("票已经卖完!");
break;
}
}
}
}
}
结果:
Thread-0还剩下1000张票
Thread-0还剩下999张票
Thread-0还剩下998张票
Thread-0还剩下997张票
Thread-0还剩下996张票
Thread-0还剩下995张票
Thread-0还剩下994张票
.
.
.