一个线程加一运算,一个线程做减一运算,多个线程同时交替运行--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
 
原文地址:https://www.cnblogs.com/liunanjava/p/4822062.html