マルチスレッドコード02の練習

複数のスレッドを作成する2番目の方法:Runnalbleインタフェースを実装します

発生する可能性のあるスレッド安全性の問題

  1. 理由カジュアルスレッドの安全性の問題:複数のスレッドシェアデータがあり、原因共有データへの1つのスレッドの動作に完了していないが、外に他のスレッドに関わってきた
    当事者がデータを共有することを保証するために、スレッド操作:セキュリティ問題のスレッドを解決する方法2ときに、他のスレッドは外で待っている必要があります。、他のスレッドが貢献データを操作できるスレッドの共有データを実行する動作を知っている
    ②①javaデータを共有しているものを達成する方法:3.動作させるための方法
    、セキュリティのスレッドを達成する方法を4.javaで:①同期同期ブロックを使用して、②使用を同期方法。

同期コードブロックの同期方法


//1. 创建实现Runnable接口的类
class Ticket1 implements  Runnable{
    int ticket =100;
    Object obj = new Object(); //必须定义到run方法以外。类似wc的灯
    //2. 重写Runnable接口中的抽象方法
    public  void run(){
        while(true){
            //同步代码块的方式
            synchronized (obj) {    //obj同步监视器 或者直接写this(当前对象)
                if (ticket > 0) {
                    try{
                        Thread.currentThread().sleep(100);
                    }catch(InterruptedException e){
                        e.printStackTrace();
                    }
                    System.out.println(Thread.currentThread().getName() + "售票,票号位:" + ticket--);
                }
            }
        }
    }
}
public class TestTicket1 {
    public static void main(String[] args) {
        //3. 创建一个实现接口的子类对象
        Ticket1 t = new Ticket1();
        //4. 将创建的子类对象作为形参传递给Thread类的构造器
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);

        t1.setName("t1窗口");
        t2.setName("t2窗口");
        t3.setName("t3窗口");

        t1.start();
        t2.start();
        t3.start();
    }
}

同期化モード同期方法

//1. 创建实现Runnable接口的类
class Ticket1 implements  Runnable{
    int ticket =100;
    Object obj = new Object(); //必须定义到run方法以外。类似wc的灯
    //2. 重写Runnable接口中的抽象方法
    public  void run(){
        while(true){
            show();
        }
    }

    //同步方法的方式  加synchronized 关键字
    public synchronized void show(){   //同步方法默认的锁是当前对象
        if (ticket > 0) {
            try{
                Thread.currentThread().sleep(100);
            }catch(InterruptedException e){
                e.printStackTrace();
            }
            System.out.println(Thread.currentThread().getName() + "售票,票号位:" + ticket--);
        }
    }
}
public class TestTicket1 {
    public static void main(String[] args) {
        //3. 创建一个实现接口的子类对象
        Ticket1 t = new Ticket1();
        //4. 将创建的子类对象作为形参传递给Thread类的构造器
        Thread t1 = new Thread(t);
        Thread t2 = new Thread(t);
        Thread t3 = new Thread(t);

        t1.setName("t1窗口");
        t2.setName("t2窗口");
        t3.setName("t3窗口");

        t1.start();
        t2.start();
        t3.start();
    }
}

おすすめ

転載: www.cnblogs.com/liyao0312/p/11622466.html