临界区(Critical Section)
一段被加锁的代码块,任何时候临界区最多只有一个线程能执行。
线程安全(thread-safe)
如果一个类被设计为允许多线程正确访问,我们就说这个类就是“线程安全”的
一些线程安全的类:
1、Java标准库的java.lang.StringBuffer也是线程安全的
2、 还有一些不变类,例如String,Integer,LocalDate,它们的所有成员变量都是final,多线程同时访问时只能读不能写,这些不变类也是线程安全的。
3、类似Math这些只提供静态方法,没有成员变量的类,也是线程安全的。
除了上述几种少数情况,大部分类,例如ArrayList,都是非线程安全的类,我们不能在多线程中修改它们。
可重入的锁
public class Counter {
private int count = 0;
public synchronized void add(int n) {
if (n < 0) {
dec(-n);
} else {
count += n;
}
}
public synchronized void dec(int n) {
count += n;
}
}
观察synchronized修饰的add()方法,一旦线程执行到add()方法内部,说明它已经获取了当前实例的this锁。如果传入的n < 0,将在add()方法内部调用dec()方法。由于dec()方法也需要获取this锁,现在问题来了:
对同一个线程,能否在获取到锁以后继续获取同一个锁?
答案是肯定的。JVM允许同一个线程重复获取同一个锁,这种能被同一个线程反复获取的锁,就叫做可重入锁。由于Java的线程锁是可重入锁,所以,获取锁的时候,不但要判断是否是第一次获取,还要记录这是第几次获取。每获取一次锁,记录+1,每退出synchronized块,记录-1,减到0的时候,才会真正释放锁。
网络号
IP地址前段
例如:某台计算机的IP是101.202.99.2,子网掩码是255.255.255.0,那么计算该计算机的网络号是
IP = 101.202.99.2
Mask = 255.255.255.0
Network = IP & Mask = 101.202.99.0(就是网络号)
网关
连接两个网络的设备
如果两台计算机计算出的网络号不同,那么两台计算机不在同一个网络,不能直接通信,它们之间必须通过路由器或者交换机这样的网络设备间接通信,我们把这种设备称为网关。
闭包
一言以蔽之:一个持有外部环境变量的函数就是闭包。