美文网首页
ThreadLocal,内部类与final

ThreadLocal,内部类与final

作者: 最困惑的时候就是能成长的时候 | 来源:发表于2019-06-03 15:48 被阅读0次

1.ThreadLocal

ThreadLocal .每个线程会在自己的线程缓存该属性的值,不会因为别的线程改变自己的线程发生改变,即使是同一个变量

public class Main {

    public static void main(String[] args) {
        //主线程
        final ThreadLocal<Boolean> param = new ThreadLocal<>();
        param.set(true);
        System.out.println("主线程 ---"+param.get());
        //1线程
        new Thread("1"){
            @Override
            public void run() {
                System.out.println("1线程---"+param.get());
            }
        }.start();
        //2线程
        new Thread("2"){
            @Override
            public void run() {
                param.set(false);
                System.out.println("2线程---"+param.get());
            }
        }.start();
    }


}

三个线程都操作同一个变量,主线程,将param变成true,线程1直接读取,线程2false,最终的结果是:


2.内部类和final

出现的条件: 1.成员方法中的局部变量或者形参 2.匿名内部类,当匿名内部类直接调用局部变量时

匿名内部类格式

例子1:只是简单的引用

1.png
1.a报错,因为a在内部类中引用.必须将a声明为final.

例子2:修改局部变量的值

2.png

2.a报错,因为在内部类中改变了a的值,这个时候需要将a变成数组

image.png

总结:在成员方法中使用其他外部类或者内部类时直接调用局部变量会有问题
1.只是使用,如例子1所示,需要添加final关键字因为没有修改所以只加final
2.修改局部变量的值,需要变成数组并添加final关键字修改了为了维护a的不变性只能让其是同一个对象所以变成数组

3.原因

内部类最终也会编译成class文件,其编译后的结果为

public class OuterClass$InnerClass {
    public InnerClass(int a){
        this.InnerClass$a = a;
       
    }
   ...
}

内部类并不是直接调用局部参数,而是利用自身的构造器对传入的参数进行备份,自己内部方法调用的实际上时自己的属性而不是外部方法传递进来的参数。

在内部类中的属性和外部方法的参数两者从外表上看是同一个东西,但实际上却不是,所以他们两者是可以任意变化的,也就是说在内部类中我对属性的改变并不会影响到外部的形参,而然这从程序员的角度来看这是不可行的,毕竟站在程序的角度来看这两个根本就是同一个,如果内部类该变了,而外部方法的形参却没有改变这是难以理解和不可接受的,所以为了保持参数的一致性,就规定使用final来避免形参的不改变。

4.实际中最常见的

开启一线程调用方法内部的局部变量或者形参
1:

final int a =0;
       new Thread(new Runnable() {
           @Override
           public void run() {
               System.out.println(a);
           }
       }).start();

2:

final int[] a =new int[]{0};
       new Thread(new Runnable() {
           @Override
           public void run() {
               a[0] = 10;
               System.out.println(a);
           }
       }).start();

相关文章

  • ThreadLocal,内部类与final

    1.ThreadLocal ThreadLocal .每个线程会在自己的线程缓存该属性的值,不会因为别的线程改变自...

  • 类的编译期与运行期

    非静态内部类 非静态内部类到底可以有静态属性吗? static成员变量,或者static final常量 非静态内...

  • 大话 ThreadLocal

    概述 ThreadLocal 介绍 ThreadLocal 关键方法讲解 ThreadLocalMap 内部类介绍...

  • ThreadLocal源码浅析

    本章内容概要 ThreadLocal用法demo ThreadLocal内部类ThreadLocalMap简述 T...

  • 内部类与final

    内部类之所以方便和实用的一个原因是:它们可以直接获取所有适当的上下文变量而不需要创建一个额外的类来保存它们.不过在...

  • ThreadLocal内存泄漏简谈

    ThreadLocal 内存泄漏 ThreadLocal内存泄露,最主要的原因在于它的内部类ThreadLocal...

  • Java内部类

    代码中包含成员内部类、内部类的同名变量访问、局部内部类、局部内部类final、匿名内部类

  • 关于一些ThreadLocal的认识

    ThreadLocal的主要实现如下: ThreadLocal中有一个静态内部类,名为ThreadLocalMap...

  • Java面试核心框架

    常量池 常用关键字 final static 内部类 抽象类 接口 异常 注解 容器 内存管理内存模型、工作内...

  • 13-面向对象

    内容: final static 匿名对象 内部类 包的声明与访问 四种访问修饰符 代码块 1. final关键字...

网友评论

      本文标题:ThreadLocal,内部类与final

      本文链接:https://www.haomeiwen.com/subject/pamcxctx.html