多线程练习-两个线程增加同一个变量-使用 Semphore 来控制线程安全.

关于Semphore(信号量)推荐看信号量Semaphore的概念及其使用(看完该篇博客再写代码会很容易)

题目

编写代码实现两个线程增加同一个变量

使用 Semphore 来控制线程安全.

代码及其注释

//编写代码实现两个线程增加同一个变量
//使用 Semphore 来控制线程安全.

public class Demo5 {
    private static int count=0;
    //可能有多个线程要对count变量进行++,count变量就相当于是一个资源
    //因此在实例化信号量时,参数为1(资源数为1)
    private static Semaphore semaphore=new Semaphore(1);
    public static void countAdd(){
        count++;
    }
    public static void main(String[] args) throws InterruptedException {
        //线程t1用来增加5000次count
        Thread t1=new Thread(()->{
            for(int i=0;i<5000;i++){
                //要对count变量进行操作,就要先申请到count变量这个资源
                try {
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                //获取到资源后再对count变量进行++
                countAdd();
                //对count变量操作完成后,要释放资源,把资源让给其他的线程使用
                semaphore.release();
            }
        });

        //线程t2用来增加5000次count
        Thread t2=new Thread(()->{
            for(int i=0;i<5000;i++){
                //要对count变量进行操作,就要先申请到count变量这个资源
                try {
                    semaphore.acquire();
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }

                //获取到资源后再对count变量进行++
                countAdd();
                //对count变量操作完成后,要释放资源,把资源让给其他的线程使用
                semaphore.release();
            }
        });

        //开启两个线程
        t1.start();
        t2.start();

        //等待两个线程执行完毕
        t1.join();
        t2.join();

        System.out.println(count);

    }
}

你可能感兴趣的:(java,算法,开发语言)