java 多线程(一)基础知识

jvm运行时内存区域:

  1. native method栈(与底层系统的方法)
  2. 虚拟机栈(局部变量、参数、方法、对象引用,线程私有)
  3. 堆(对象实例,GC堆,线程共享)
  4. 程序计数器(记录每个线程执行的字节码行数,方便线程切换,本地方法不记录,线程私有)
  5. 方法区(静态变量、常量、静态方法、类信息,线程共享)
  6. 常量池(类的版本、字段、方法、接口等描述信息外,还有一项信息是常量池,线程共享)

java线程是(内核控制线程:又称轻型进程lwp(light weight process))

java线程是混合型的线程模型,一般而言是通过lwp将用户级线程映射到内核线程中。意味着用户能够控制线程的分配和启停,也意味着内核能够感知调度线程,利用多核cpu处理,有自己的存储区域(保存寄存器、程序计数器、栈指针等)

多线程的竞态争夺,导致数据被重复读写以及操作

jvm内存模型使用屏障的方法,保证指令的顺序,例如锁、voilate等。

CPU指令重排序造成多个线程数据脏读

jvm内存模型使用屏障的方法,保证指令的顺序,例如锁、voilate等。

java多线线程voilate 保证可见性

当线程1修改变量后,强制执行store和wirte操作,将工作内存的值保存到主内存(运行时数据区中的堆内)

当线程2读取变量是,强制废弃之前的变量,执行read,将主内存的数据读取到工作内存

synchronized 方法

原理类似于voilate,但比voilate更加重量级,性能开销大

两种写法获取对象实例锁:synchronized method(){}    synchronized(object){}

若用在静态方法上则会获取整个所有实例起作用

wait()释放锁,线程进入等待状态;notify() notifyall()通知wait状态线程获取锁;sleep()进入等待,但不会释放锁;interrupt()是线程重新获取锁,但会抛出异常。

ReentrantLock(同样为线程的可重入锁,但是具有公平锁、锁等待、需要手动释放锁、手动处理异常等)

reetrantlock在控制线程上颗粒度更细,例如在阻塞队列中,通过condition的控制,可以指定是消费线程还是生成线程重等待中启动,对比与sychronized的随机唤醒线程,节约了时间。

ThreadLocal

ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享。

包装类型(integer\string\double等)在函数传参过程(实际还是引用传递)或者多线程中使用时会重新分配内存(若值发生变化),这样导致锁是无效的。

包装类型本质是个不可变类,由final进行修饰,当进行改变时,会重新分配内存赋值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值