【JAVA核心知识】17.1:线程间变量共享

变量共享是进行线程间通信的常用手段之一,java的内存模型(JMM)解决了可见性和有序性,我们则可以通过线程锁保证原子性。


有变量:
class ShareData {
          
   
    int num = 0;
    
    public synchronized void inrc() {
          
   
        num++;
    }
    
    public synchronized void desc() {
          
   
        num--;
    }
}

常用的变量共享手段有:

继承Runnable将变量作为成员变量

public static void main(String[] args) {
          
   
        ShareData shareData = new ShareData();
        InrcRunnable incrRun = new InrcRunnable(shareData);
        DescRunnable descRun = new DescRunnable(shareData);
        new Thread(incrRun).start();
        new Thread(descRun).start();
}
class InrcRunnable implements Runnable {
          
   
    ShareData shareData;
    
    public InrcRunnable(ShareData shareData) {
          
   
        this.shareData = shareData;
    }
    
    @Override
    public void run() {
          
   
        shareData.inrc();
    }
}
class DescRunnable implements Runnable {
          
   
    ShareData shareData;
    
    public DescRunnable(ShareData shareData) {
          
   
        this.shareData = shareData;
    }
    
    @Override
    public void run() {
          
   
        shareData.desc();
    }
}

将变量定义为final直接访问

public static void main(String[] args) {
          
   
    final ShareData shareData = new ShareData();
    new Thread(new Runnable() {
          
   
        @Override
        public void run() {
          
   
            shareData.inrc();
        }
    }).start();
    new Thread(new Runnable() {
          
   
        @Override
        public void run() {
          
   
            shareData.desc();
        }
    }).start();
}

jdk1.8不再需要添加final修饰符,这是因为该版本的jdk会隐式的为这些变量添加final修饰词。

经验分享 程序员 微信小程序 职场和发展