synchronized:使用synchronized虽然解决了共享变量value的内存可见性问题,但由于synchronized是独占锁,同时只能有一个线程调用 get()方法,其他调用线程则会被阻塞,同时存在线程切换、调度的开销,效率并不高。
volatile:volatile虽然保证了可见性,但并不保证操作的原子性;可以使用synchronized
给它“上锁”
各种锁:悲观锁和乐观锁、公平锁和非公平锁、独占锁和共享锁、可重入锁、自旋锁
1.ThreadPoolExecutor
2.ThreadLocalRandom
Runnable
是一个函数式接口
@FunctionalInterface
public interface Runnable {
public abstract void run();
}