package thread2;
/*
* 解决线程安全问题:
* sun提供了线程同步机制解决线程安全问题:
* 1.同步代码块
* synchronized("锁对象")
{
需要被同步的代码。。。
}
任何的对象都可以作为锁对象,凡是对象内部都维护了一个状态的,
JAVA同步机制就是使用了对象中的状态作为了锁的标识。state 0 开,1标识关
* 2.同步函数:同步函数就是使用synchronized修饰一个函数
*/
class SaleTickets extends Thread{
static int num = 50;
public SaleTickets(String name) {
super(name);
}
@Override
public void run() { //线程的任务是买票的
while(true) {
synchronized("锁") {
if(num > 0) {
System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");
num--;
try {
Thread.sleep(50); //设置线程休眠的时间(毫秒)
}catch(InterruptedException e) {
e.printStackTrace(); //捕获异常
}
}else {
System.out.println("不好意思,票已经售罄,请下次再来!");
break;
}
}
}
}
}
public class Demo2 {
public static void main(String[] args) {
SaleTickets a = new SaleTickets("窗口1");
SaleTickets b = new SaleTickets("窗口2");
SaleTickets c = new SaleTickets("窗口3");
a.start();
b.start();
c.start();
}
}
package thread2;
/*
* 解决线程安全问题:
* sun提供了线程同步机制解决线程安全问题:
* 1.同步代码块
* synchronized("锁对象")
{
需要被同步的代码。。。
}
任何的对象都可以作为锁对象,凡是对象内部都维护了一个状态的,
JAVA同步机制就是使用了对象中的状态作为了锁的标识。state 0 开,1标识关
* 2.同步函数:同步函数就是使用synchronized修饰一个函数
*/
class SaleTickets extends Thread{
static int num = 50;
public SaleTickets(String name) {
super(name);
}
@Override
public void run() { //线程的任务是买票的
while(true) {
synchronized("锁") {
if(num > 0) {
System.out.println(Thread.currentThread().getName()+"售出了第"+num+"号票");
num--;
try {
Thread.sleep(50); //设置线程休眠的时间(毫秒)
}catch(InterruptedException e) {
e.printStackTrace(); //捕获异常
}
}else {
System.out.println("不好意思,票已经售罄,请下次再来!");
break;
}
}
}
}
}
public class Demo2 {
public static void main(String[] args) {
SaleTickets a = new SaleTickets("窗口1");
SaleTickets b = new SaleTickets("窗口2");
SaleTickets c = new SaleTickets("窗口3");
a.start();
b.start();
c.start();
}
}