笔记

1、方法区与 Java 堆一样,是各个线程共享的内存区域。
2、static关键字的基本作用:方便在没有创建对象的情况下来进行调用(方法/变量)。
3、static可以修饰 方法 成员变量(属性) 代码块(不能出现在方法内部),对于静态方法来说,是没有this的,因为它不依附于任何对象
注:1.独立于类
  2.在类加载的时候执行,只执行一次
  3.修饰的方法只在调用时执行
4、在静态方法中不能访问类的非静态成员变量和非静态成员方法,因为非静态成员方法/变量都是须依赖具体的对象才能够被调用。
  但是在非静态成员方法中可以访问静态变量及静态属性
5、 静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化。
  而非静态变量是对象所拥有的,在创建对象的时候被初始化,存在多个副本,各个对象拥有的副本互不影响。 
  瞎几把说:静态变量对于对象来说是公有的,所有对象全部使用同一个数据。非静态变量对于对象来说是私有的,自己修改别人不变。
6、static块可以置于类中的任何地方,类中可以有多个static块。在类初次被加载的时候,会按照static块的顺序来执行每个static块,并且只会执行一次。
7、静态成员变量虽然独立于对象,但是不代表不可以通过对象去访问,所有的静态方法和静态变量都可以通过对象访问(只要访问权限足够)。
8、在Java中,static是不允许用来修饰局部变量
9、执行过程:
  1.加载类:通过jvm调用ClassLoader类中的loaderClass方法加载我们要执行的类
  2.执行static修饰的内容(从上往下执行)
  3.调用构造器
  4.成员变量初始化
  5.执行构造方法,对象创建完毕
注:
  1.static修饰的属性和方法,使用类名.xx的形式访问。
  2.使用的位置:那些不需要通过创建对象就可以访问方法的情况。
10、wait和sleep的区别
  { wait属于Object类
  sleep属于Thread类 }
  { wait会释放锁,属于醒着的状态等待
  sleep不会释放锁,属于抱着锁睡着的状态 }
  { wait必须在同步代码块中使用
  sleep可以在任何地方睡 }
  { wait不用捕获异常
  sleep必须捕获异常 }
11、synchronized类比自动挡,Lock属于手动挡 
  Lock三部曲:
  1.new ReentrantLock()对象 2.加锁 lock.lock(); 3.解锁 lock.unlock(); 
12、公平锁:十分公平 有先来后到 后来的锁必须等待前面的锁执行完
  非公平锁:十分不公平,可以插队(默认为分公平锁) 因为公平锁如果出现两个线程 一个3小时执行完 一个3秒执行完,3s要等3h,浪费时间
13、synchronized和Lock的区别
  1.synchronized 是Java关键字,Lock是一个类。
  2.synchronized无法判断获取锁的状态,Lock可以判断是否获取到了锁。
  3.synchronized会自动释放锁,Lock必须要手动释放锁,如果不释放锁,就会造成死锁。
  4.synchronized线程1(获得锁,阻塞)线程2(等待,一直等待) Lock锁就不一定会等待下去。
  5.synchronized可重入锁,不可以中断的,非公平锁;Lock可重入锁,可以判断锁的状态,默认非公平锁(可以在ReentrantLock()中加入boolean,true就是公平锁)
  6.synchronized适合锁少量的代码同步问题,Lock适合锁大量的同步代码。
14、生产者消费者模式:记住三段就好       首先判断是否需要等待,是就等待,否就执行业务代码,执行完业务代码就通知其他线程,完事。

Synchronized版本生产消费: Synchronized  wait   notify

Lock版本生产消费:Lock   Condition.awit   Condition.signal

Condition替代了同步监视器

本质就是Lock替换了Synchronized方法和语句的使用,Condition取代了对象监视器方法的使用。

15、Condition精准的通知和唤醒线程,让线程按顺序依次执行、

 

posted @ 2020-05-24 10:14  SpaceJz  阅读(102)  评论(0编辑  收藏  举报