JAVA 多线程详解

84 阅读2分钟

本质:java 内存的特点:重排序(1、编译时,对操作循序的排序;地点:寄存器2、cpu 对操作的重排序,地点:处理器的特定缓存)

接口:

thread

runnable()

实现Callable接口,这JUC并发包下的,属于比较高级的用法

sleep(时间)/wait():前者睡觉,还活着;后者死了重生在等待锁池等待。

关键字volatile :同步:保证可见性,不保证原子性;相比普通变量:关闭了java 的重排序,保证了(原本的)有序性;但是由于增加了内存屏蔽的操作,在写方面,比普通内存慢了很多;本质是存取都是直接从内存开始,跳过缓存的步骤。普通的变量从cpu缓存再到内存。

synchronized: 同步:保证可见性原子性;

  1. 普通同步方法(实例方法),锁是当前实例对象 ,进入同步代码前要获得当前实例的锁
  2. 静态同步方法,锁是当前类的class对象 ,进入同步代码前要获得当前类对象的锁
  3. 同步方法块,锁是括号里面的对象,对给定对象加锁,进入同步代码库前要获得给定对象的锁。

final:要区分static、普通变量的区别,对于java,基本单位class,static 属于class, final、普通变量属于对象,每一个对象都有自己的final。final 类似const,保证指向的内容不可修改;(注意:禁止继承、修改对象、方法和变量)

多线程在分布式的局限与解决方案:

局限:锁的作用域无法覆盖整个分布式,锁的局限性。
解决方案:

  1. 消息队列:将要处理的事务放到队列里统一处理,串行处理;
  2. zookeeper:主要调用acqurie(获取锁),release (释放锁);当然还有其他的函数调用,本质上还是消息队列;注意这个可以解决服务器宕机问题。
  3. redis:调用redis.setnx()、redis.expire()来实现锁,但是如果setnx()失效就会导致过期时间无效,造成死锁。