zoukankan      html  css  js  c++  java
  • 一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--synchronized

    使用synchronized

    package com.pb.thread.demo5;
    
    /**使用synchronized
     * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行
     * 
     * @author Denny
     *
     */
    public class Count {
        private int num = 0;
        private boolean flag = false; // 标识
        //加法
        public synchronized void add() {
            while (flag) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.num++; //
            System.out.println(Thread.currentThread().getName() + "........" + this.num);
            this.flag=true; //设置标识为true
            notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒
            
        }
        //减法
        public synchronized void sub() {
            while (!flag) {
                try {
                    wait();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            this.num--; //
            System.out.println(Thread.currentThread().getName() + "........" + this.num);
            this.flag=false; //设置标识为true
            notifyAll(); //唤醒所有在线程池中冻结的线程,会把所有都唤醒
        }
    }
    package com.pb.thread.demo5;
    
    public class Add implements Runnable {
        private Count count;
        public Add(Count count){
            this.count=count;
        } 
    
        @Override
        public void run() {
            while(true){
                count.add();
            }
    
        }
    
    }
    //================
    package com.pb.thread.demo5;
    
    
    public class Sub implements Runnable {
        private Count count;
        public Sub(Count count){
            this.count=count;
        } 
    
        @Override
        public void run() {
            while(true){
                count.sub();
            }
    
        }
    
    }
     

    测试类

    package com.pb.thread.demo5;
    
    public class CountTest {
    
        public static void main(String[] args) {
            Count c=new Count();
            Add add=new Add(c);
            Sub sub=new Sub(c);
            Thread t1=new Thread(add);
            Thread t2=new Thread(add);
            Thread t3=new Thread(sub);
            Thread t4=new Thread(sub);
            t1.start();
            t2.start();
            t3.start();
            t4.start();
    
        }
    
    }

    结果:

     
    Thread-2........0
    Thread-1........1
    Thread-3........0
    Thread-0........1
    Thread-2........0
    Thread-1........1
    Thread-3........0
    Thread-0........1
    Thread-2........0
     

    不使用synchronized

    package com.pb.thread.demo4;
    
    import java.util.concurrent.locks.Condition;
    import java.util.concurrent.locks.Lock;
    import java.util.concurrent.locks.ReentrantLock;
    /**
     * 一个线程加一运算,一个线程做减法运算,多个线程同时交替运行
     * @author Denny
     *
     */
    public class Count {
        private int num = 0;
        private boolean flag=false; // 标识
        Lock lock = new ReentrantLock(); //
        Condition add = lock.newCondition(); // 加法锁
        Condition sub = lock.newCondition();// 减法锁
    
        public void add() {
            lock.lock();// 锁上
            try {
                while (flag) {  //循环判断
    
                    add.await();
                }
                this.num++;
                System.out.println(Thread.currentThread().getName() + "........" + this.num);
                this.flag = true; // 设置标识
                sub.signal(); // 唤醒指定线程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally{
                lock.unlock();
            }
    
            
        }
    
        public void sub() {
            lock.lock();// 锁上
            try {
                while (!flag) {//循环判断
    
                    sub.await();
                }
                this.num--;
                System.out.println(Thread.currentThread().getName() + "........" + this.num);
                this.flag = false; // 设置标识
                add.signal(); // 唤醒指定线程
            } catch (InterruptedException e) {
                e.printStackTrace();
            }finally{
                lock.unlock();
            }
    
            
        }
    
    }

     

    package com.pb.thread.demo4;
    
    public class Add implements Runnable {
        private Count count;
        public Add(Count count){
            this.count=count;
        } 
    
        @Override
        public void run() {
            while(true){
                count.add();
            }
    
        }
    
    }
    package com.pb.thread.demo4;
    
    public class Sub implements Runnable {
        private Count count;
        public Sub(Count count){
            this.count=count;
        } 
    
        @Override
        public void run() {
            while(true){
                count.sub();
            }
    
        }
    
    }
    package com.pb.thread.demo4;
    
    public class CountTest {
    
        public static void main(String[] args) {
            Count c=new Count();
            Add add=new Add(c);
            
            Sub sub=new Sub(c);
            Thread t1=new Thread(add);
            Thread t2=new Thread(add);
            Thread t3=new Thread(sub);
            Thread t4=new Thread(sub);
            t1.start();
            t2.start();
            t3.start();
            t4.start();
    
        }
    
    }

     

    结果:

     
    Thread-1........1
    Thread-3........0
    Thread-0........1
    Thread-2........0
    Thread-1........1
    Thread-3........0
    Thread-0........1
    Thread-2........0
     
  • 相关阅读:
    AOP概述
    函数调用规定
    lexical scoping vs. dynamic scoping
    [C++]C++11新特性
    JavaScript Tutorial 05 #Class#
    JavaScript Tutorial 04 #Function#
    JavaScript Tutorial 03 #Array#
    JavaScript Tutorial 02 #Object#
    JavaScript Tutorial 01 #Basic#
    Win32 Thread Information Block
  • 原文地址:https://www.cnblogs.com/liunanjava/p/4822062.html
Copyright © 2011-2022 走看看