Java 加了同步代码块后变单线程了

package XianCheng;

public class RunnableS implements Runnable {
private Integer i = 100;
private Object obj = new Object();
private int aa = 0;

@Override
public void run() {
    while (true) {
        if (aa % 2 == 0) {
            synchronized (obj) {
                if (i > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "卖第" + i + "张票" + aa);
                    i--;
                }
            }
        } else {
            synchronized (obj) {
                if (i > 0) {
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "卖第" + i + "张票" + "else");
                    i--;
                }
            }
        } aa++;

    }

}

}

public static void main(String[] args) {
RunnableS rr = new RunnableS();
Thread t1 = new Thread(rr,"1号窗口");
Thread t2 = new Thread(rr,"2号窗口");
Thread t3 = new Thread(rr,"3号窗口");
Thread t5 = new Thread(rr,"4号");
t1.start();
t2.start();
t3.start();
t5.start();

是不是到了考试季,这几天经常看到同样的问题在提问,下面的代码可以参考
公共资源类

package com.test.thread;
 
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
 
/**
 * 共享资源,这里就是100张票
 * @author Jiyh
 *
 */
public class Tickets {
 
    //总票数
    private int tickets = 10;
    
    //锁
    private Lock lock = new ReentrantLock();
    
    public int sellTicket(){
        int currTicket = 0;
        try {
            lock.lock();
            if(tickets > 0){
                currTicket = tickets;
                tickets--;
            }
             
        } catch (Exception e) {
            // TODO: handle exception
        }finally{
            lock.unlock();
        }
        return currTicket;
    }
}

线程类

package com.test.thread;
 
public class SellTicket implements Runnable {
    
    //公共资源对象
    private Tickets tickets;
    
    public SellTicket(Tickets tickets){
        this.tickets = tickets;
    }
    
    @Override
    public void run() {
        while (true){
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            int ticket = tickets.sellTicket();
            if(ticket <= 0){
                System.out.println(Thread.currentThread().getName()+"->票卖完了,退出");
                break;
                
            }
            System.out.println(Thread.currentThread().getName()+"->卖出第"+ticket+"张票");
        }
 
    }
 
}

测试类

package com.test.thread;
 
public class Test {
 
    public static void main(String[] args) {
        Tickets tickets = new Tickets();//公共资源,同一个对象传给不同线程
        
        //以下创建的3个线程,共享tickets 资源
        SellTicket st1 = new SellTicket(tickets);
        Thread t1 = new Thread(st1, "窗口一");
        
        SellTicket st2 = new SellTicket(tickets);
        Thread t2 = new Thread(st1, "窗口二");
        
        SellTicket st3 = new SellTicket(tickets);
        Thread t3= new Thread(st1, "窗口三");
        
        t1.start();
        t2.start();
        t3.start();
        
    }
}


结果

img

img

创建4个RunnableS对象,分别传给4个Thread。