十二,包与权限相关知识

血红的双手。 提交于 2021-02-02 21:54:52
1. 包的定义 包( package )是 Java 提供的一种区别类的名字空间的机制 , 是类的组织方式 , 是一组相关类和接口的集合 , 它提供了访问权限和命名的管理机制 . 实际上就是一个文件夹 , 在不同的文件夹中可以存在同名的类 . 语法 : package aaa.bbb.ccc ; Java 中提供的包主要有以下 3 种用途 : 将功能相近的类放在同一个包中 , 可以方便查找与使用 . 由于在不同包中可以存在同名类 , 所以使用包在一定程度上可以避免命名冲突 . 在 Java 中 , 某次访问权限是以包为单位的 . 打包之后的类 , 实际上就是包路径 . 类名称了 . 有了打包 , 自然就有了导包的操作 , 关键字是 import. 需要注意的一点只有 public class 才能被外包类引用 . 导包中也可以用 * 来表示导入该目录下的需要使用的类 . 它不会影响性能 , 而具体到类名的性能是一样的 . 注 : 导入其他类的时候可能出现重名的情况 , 这时实例化操作的时候会报错 , 正确的操作是写完整的包 . 类名来实例化对象 . 2. 静态导入 要使用静态成员(方法和变量)我们必须给出提供这个静态成员的类 . 使用静态导入可以使被导入类的静态变量和静态方法在当前类直接可见 , 使用这些静态成员无需再给出他们的类名 . 静态导入也是 JDK1.5 引入的新特性 .

Java多线程之内存可见性

一曲冷凌霜 提交于 2019-12-06 03:31:30
Java内存模型( JMM ) : 1) 所有的变量都存储在主内存中 2) 每个线程都有自己独立的工作内存, 里面保存该线程使用到的变量的副本 ( 主内存中该变量的一份拷贝 ) JMM 两条规定: 1) 线程对共享变量的所有操作都必须在自己的工作内存中进行 2) 不同线程之间无法直接访问其他线程工作内存中的共享变量, 线程间共享变量值的传递必须通过主内存 线程间共享变量可见性实现的原理: 线程A 对共享变量的修改想被线程B 及时看到, 必须要经过以下2个步骤: 1) 把线程A 工作内存中更新过的共享变量刷新到主内存中 ( store ) 2) 将主内存中最新的共享变量的值共享到线程B 工作内存中 ( load ) Java 语言层面支持的可见性实现方式: 1) synchronized 2) volatile JUC 包下的类也可以实现可见性 1) Atomic 2) ReentrantLock 3) Semaphore 1. synchronized 实现可见性 JMM 关于 synchronized 的两条规定: 1) 线程释放锁前, 必须把共享变量的最新值从该线程的工作内存刷新到主内存中 2) 线程持有锁时, 将清空该线程工作内存中共享变量的值, 从主内存中读取最新的值 synchronized 实现可见性的原因: 线程释放锁前对共享变量的修改在下次持有锁时对其他线程可见