多线程的启动方式以及synchronized原理

多线程的启动方式以及synchronized原理


进程、线程

在这里插入图片描述
进程是资源分配的基本单位
线程是调度执行基本单位 共享进程资源
线程:一个程序中不同的执行路径就是线程

多线程实现方式

第一种:继承Thread 重写run方法 new Mythread().start();
第二种:实现Runnable类,重写run方法,但是运行起来需要new thread(new Myrun()).start();
第三种:labmba表达式或者是线程池方式。
在这里插入图片描述

这里注意下多线程的启动方式,直接调用run方法与start方法的区别,如果后续代码调用run,那么是等待run执行完毕再运行下面代码,如果用start,那么就是并行运行了。

sleep、yield、join、interrupt

interrupt方法:
Interrupt,设置线程标记位
在这里插入图片描述
注意:
1.Sleep与wait中设置打断中有interuptEx异常,需要捕捉。
2.Interupt会不会把syn锁打断?不会,只是设标志位,不会打断他。
3.Interrupt与lock会不会打断?不会干扰到。如果想干扰,用lockInterruptibly方法。
由interrupt引申出一个问题,如何优雅的结束一个线程?

1.调用stop方法,但是不使用了。主要产生数据不一致问题,太粗暴了,直接挂机,不会做善后的工作。
2. Resume与suspend方法,被废弃。原因与stop同样原因。
3. 用volatile(可见性)保证
4. 用Interupt AND isInterrupted

这里有个多线程的设计模式,两阶段终止模式。
yield方法:
让当前线程从running进入runnable就绪状态,但是仍然有可能此线程运行。

join方法:
t1等待t2执行结束,再继续运行。可以应用到线程的同步上。也可以设置等待时间,若超过等待时间,则不等待该线程执行完毕。

sleep方法:
从running状态到有时效的等待状态(time waiting)。

多线程的状态图

在这里插入图片描述

synchronized

Synchronized关键字
多个线程访问同个资源需要上锁。底层是hostpot的markword,有个64位,其中两位控制锁,01代表synchronized。
Synchronized(this)与synchronized方法是等效的。
Synchronized static方法等同于锁的是class。
程序中出现异常,默认锁释放。

Sync(object):用markword记录这个线程ID(偏向锁)。

synchronized原理:
sync原理前,我们首先要知道一个monitor的概念与java对象头的概念。

一个对象包含3部分:对象头、实例数据以及对齐填充。
java对象头在64位机中,存的是mark word 、类型指针,如果是数组还有数组的长度信息。
而mark word存的的是4bit的分代年龄(这也是为什么垃圾回收器的阈值为15的原因),是否偏向、hashcode、是否加锁等信息。

Monitor是一个监视器或者称之为管程,他是由OS提供的,每个java对象可以关联到monitor对象,当使用synchronized时,mark word会指向monitor。
monitor有三个部分:
在这里插入图片描述
waitSet这部分涉及到wait/nontify的作用,通常是指令wait时,将线程放入waitSet池中。
EntryList这部分为阻塞队列,通常是不能占用owner时的其他线程。
owner则为正在运行的线程。

而同步方法通过ACC_SYNCHRONIZED 关键字对方法进行加锁。当线程要执行的方法被标注上ACC_SYNCHRONIZED时,需要先获得锁才能执行该方法。

同步代码块通过monitorenter和monitorexit执行来进行加锁。当线程执行到monitorenter的时候要先获得锁,才能执行后面的方法。当线程执行到monitorexit的时候则要释放锁。每个对象自身维护着一个被加锁次数的计数器,当计数器不为0时,只有获得锁的线程才能再次获得锁。

什么时候用重量级锁?什么时候用自旋锁?
执行次数长,线程多,用重量级锁
执行时间短,线程少,用自旋

注意sync锁的时候,不能锁string常量,integer与long
锁升级:无锁(00)、偏向锁(01)、自旋锁(10)、重量级锁(10)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值