A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

silence

初级黑马

  • 黑马币:

  • 帖子:

  • 精华:

package threads;

public class MultiThreadShareData {

        public static void main(String[] args) {
               
                MultiThreadShareData x = new MultiThreadShareData();
               
                SharingData data = x.new SharingData();
               
                final Thread1 thread1 = x.new Thread1(data);//此两句中如果没有final,编译会有错误,为什么???
                final Thread2 thread2 = x.new Thread2(data);//此两句中如果没有final,编译会有错误,为什么???
               
                for(int i = 0; i < 2; i++){
                        new Thread(new Runnable(){
                                @Override
                                public void run() {
                                       
                                        while(true){
                                                thread1.decrease();//错误会出现与此,请注意
                                        }
                                }
                        }).start();
                       
                       
                        new Thread(new Runnable(){
                                @Override
                                public void run() {
                                       
                                        while(true){
                                                thread2.increase();////错误会出现与此,请注意
                                        }
                                }
                        }).start();
                }

        }

        class Thread1{
                private SharingData data;
                public Thread1(SharingData data){
                       
                        this.data = data;
                       
                }
                public void decrease(){
                        data.decrease();
                }

        }
       
        class Thread2{
                private SharingData data;
                public Thread2(SharingData data){
                       
                        this.data = data;
                       
                }
                public void increase(){
                       
                        data.increase();
                       
                }
        }
       
        class SharingData{
                private int data = 100;
                public synchronized void increase(){
                        data++;
                       
                        System.out.println(Thread.currentThread().getName() + " is increasing the data " + data);
                }
               
                public synchronized void decrease(){
                        data--;
                       
                        System.out.println(Thread.currentThread().getName() + " is decreasing the data " + data);
                }
        }

}

评分

参与人数 1技术分 +2 收起 理由
职业规划-刘倩老师 + 2 赞一个!

查看全部评分

2 个回复

正序浏览
在方法中的内部类中访问方法中的局部变量时,这个变量必须是final的;
因为,局部变量在方法运行结束之后生命周期就结束了,而内部类对象的生命周期还有可能没结束,为了能够访问到这个变量,就需要加上finla;
回复 使用道具 举报
规定:局部内部类访问局部变量时,必须将局部变量进行final关键字修饰。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马