解决在高并发情况下出现数字混乱的问题

package com.java.test;
 
import java.math.BigDecimal;
import java.util.Random;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
 
public class RateService {
 //设置BigDecimal类型的数据
 private  BigDecimal rate = BigDecimal.ZERO;
 //添加读写锁来对读写操作进行加锁。
 private ReadWriteLock rwlock=new ReentrantReadWriteLock();
 
 public BigDecimal getRate() {
  rwlock.readLock().lock();//添加读锁
  BigDecimal rate = this.rate;
  rwlock.readLock().unlock();//解锁
  return rate;
 }
 
 public void setRate(BigDecimal rate) {
  rwlock.writeLock().lock();//添加写锁
  this.rate = rate;
  rwlock.writeLock().unlock();//解锁
 }
 
 public static class write  implements Runnable{
  RateService rateService = new RateService();
  public write(RateService rateService){
   this.rateService=rateService;
  }
  @Override
  public void run() {
   BigDecimal newrate = new  BigDecimal(new Random().nextInt(100));
   //对当前线程进行同步操作
   synchronized(this) {  
   rateService.setRate(newrate);
   //System.nanoTime() 是一个获取计算机执行时间的方法 获取精度在纳秒
   System.out.println(System.nanoTime()+":"+Thread.currentThread().getName()+""+newrate);
   }
  }
 }
 public static class read  implements Runnable{
  RateService rateService = new RateService();
  public read(RateService rateService){
   this.rateService=rateService;
  }
  @Override
  public void run() {
 
   System.out.println(Thread.currentThread().getName()+":"+this.rateService.getRate());
  }
 
 }
 
 public static void main(String[] args) {
  RateService rateService =new RateService();
  write w = new write(rateService);
  for(int i=0;i<10;i++){
   Thread t= new Thread(w);
   t.setName("write"+i+":");
   t.start();
  }
  read r = new read(rateService);
  for(int i =0 ;i<10;i++){
   Thread t = new Thread(r);
   t.start();
  }
 }
 
}
原文地址:https://www.cnblogs.com/fliay/p/7106959.html