天天看点

juc学习

lambda表达式:

函数式接口

1.在重写接口中的方法时,使用lambda表达式:拷贝小括号,写死右箭头,落地大括号

[email protected]注解 被标记的接口中只能有一个方法声明 或者可以有一个方法声明和多个默认的方法 也可以有多个static方法

3.ArrayList是线程称不安全的 初始空间为10,每次扩容为上一次的一般,例如第一次扩容为5,扩容后为15,第二次扩容为7,扩容后为22…

ArrayList线程不安全的代码示例

public class ArrayListThreadNotSafe {

public static void main(String[] args) {

List list=new ArrayList();

for (int i = 0; i < 3; i++) {

new Thread(()->{

list.add(UUID.randomUUID().toString().substring(0,8));

System.out.println(list);

},String.valueOf(i)).start();

}

解决方法

1.List list=new Vector();

2.List list=Collections.synchronizedList(new ArrayList<>())

3.List list=new CopyOnWriteArrayList();//写时复制

4.HashMap的初始空间为16,每次扩容为上次空间的2倍,例如第一次扩容后的空间为32,第二次为64…

5.一个对象里面有多个synchronized方法,某一个时刻内,只要一个线程去调用其中的一个synchronized方法了,其他的线程都只能等待,换句话说,某一个时刻内,只能有唯一一个线程去访问这些synchronized方法,也就是说锁的是当前对象,被锁定后,其他的线程都不能进入到当前对象的其他的synchronized方法。

6.所有的非静态问步方法用的都是同一把锁 实例对象本身,synchronized实现同步的基础:Java中的每一个对象都可以作为锁。

具体表现为以下3种版式。

对于普通同步方法,锁是当前实例对象。

对于同步方法块,锁是synchonized括号里的配置对象。

对于静态同步方法,锁是当前类的Class对象。

当一个线程试图访问同步代码共时,它首先必须得到锁,退出或抛出异常时必须释放锁。

也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以无须等待该实例对象已获取锁的非静态同步方法释放锁就可以获我他们自己的锁。

所有的静态同步方法用的也是同一把锁–类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有静态条件的。

但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要是它们同一个类的实例对象!