JAvaマルチスレッド-ATomic

3920 ワード

Atomic原子パックは簡単に使用できますが、ここではAtomicIntegerでカウントします(他のものは多くありません)

import java.util.concurrent.atomic.AtomicInteger;

public class Ticket {
    public final  AtomicInteger x = new AtomicInteger(1000000);
}

切符を買うことを例にとると、ここでは切符の数、簡単なクラスであり、スレッドを呼び出して切符を買う.
class BuyTicket implements Runnable {

    private Ticket ticket;

    public BuyTicket(Ticket ticket) {
        this.ticket = ticket;
    }

    @Override
    public void run() {   
        ticket.x.getAndAdd(-1);
    }
}

10000スレッドを呼び出して切符を買いに行きます
public class BuyTicketThreadDemo {

    public static void main(String args[]) throws InterruptedException {

        Ticket ticket = new Ticket();
        System.out.printf("
= %d
"
, ticket.x.get()); Runnable r1 = new BuyTicket(ticket); Thread []thread = new Thread[10000]; for (int i = 0; i < 10000; i++) { thread[i] = new Thread(r1); } for (int i = 0; i < 10000; i++) { thread[i].start(); } Thread.sleep(500); System.out.println("\b
The remainder of the ticket is "
+ ticket.x.get()); } }

結果は990000で、これは正しいです.具体的にはここから見ることができて、よく書いて、私はjava-マルチスレッドの深い(5)Atomic JavaのActomicクラスの分析を繰り返しません

切符を買う前に切符が残っているかどうかを判断したい場合を考えています。

class BuyTicket implements Runnable {

    private Ticket ticket;

    public BuyTicket(Ticket ticket) {
        this.ticket = ticket;
    }

    @Override
    public void run() {   //      
        if (ticket.x.addAndGet(-1) < 0) {
            System.out.println(" !");
            ticket.x.getAndIncrement();
        } else {
            System.out.println(" !");
        }
    }
}

买う时に相当して、まずぶらぶらして、买った后に条件に合っているかどうかを见て、もし合わないならば、返します.