不加锁是三个线程,怎么加个锁就变成一个线程了??

public class Test06 {
public static void main(String[] args) {
BuyTicket buyTicket = new BuyTicket();
Thread t1 = new Thread(buyTicket,"小明");
Thread t2 = new Thread(buyTicket,"小红");
Thread t3 = new Thread(buyTicket,"小刘");
t1.start();
t2.start();
t3.start();
}

}

class BuyTicket implements Runnable {
private int ticketNums = 100;
private boolean flag = true;

@Override
public void run() {
    while (flag) {
        try {
            buy();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

private void buy() throws InterruptedException {
    synchronized (this){
        if (ticketNums <= 0) {
            flag = false;
            return;
        }
        Thread.sleep(100);
        System.out.println(Thread.currentThread().getName() + "拿到了第" + ticketNums-- + "张票");
    }
}

}

img

img

这就是锁的价值啊。当多线程访问同一对象时,锁使得该对象在某一时刻只能被某一个线程访问,因为一个票不能同时分配给2个以上的人。你看到的结果是类似于单线程的效果,但是仍然是多线程。只是加锁以后,对票数这个数据的访问变成了互斥行为(线程间互斥,同一时刻只有一个线程能访问票数这个变量),也就导致看上去像是单线程访问一样,从而保证数据安全。

当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行。另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块。

你可以百度下 synchronized(this)

这说法很有问题
不加锁是三个线程,加个锁它也还是3个线程,不可能就成 了一个线程;
只是它们的执行结果看起来想法一个线程在执行