SQLServer Decimal数据类型怎么赋值
276
2022-09-26
3.你真的知道线程间是如何通信的么?
线程启动后,它会在自己独有的栈空间里面运行,但是实际上,两个线程之间是会相互通信的,因为只有这样才能使线程间更加灵活,是资源使用的更加充分。
volatile 和synchronized 关键字
volatile 关键字
首先:volatile 存在的意义就是保证共享变量的可见性。
什么叫做可见性呢?
可见性体现在:两个线程对同一个共享变量进行操作,其中一个线程对其修改,另外一个线程是看不到这个变化的。
为什么会出现这个原因呢?
volatile 怎么解决可见性的问题呢?
当对volatile 修饰的变量进行修改时,会将当前改变刷新到共享区域,并且使其他存有该变量的线程访问的内存地址失效,重新到共享区域获取该变量。
synchronized
大家对这个肯定不陌生,这个关键字就是给代码块或者方法加锁的,那么经它修饰后的代码,会变成什么样呢?我们反编译看下如下代码:
通过反编译后的结果可以看出来:jvm在我们的代码前后加上了monitor和monitorexit,通过这个实现锁的功能,细心的同学可以看出来,反编译结果里面有两个monitorexit,这是jvm为了保证成功释放监视器,做的一个兜底操作。
等待通知
首先说下本节的场景是什么:
现在有两个线程线程1需要从苹果篮子里面拿苹果线程2往苹果篮子里面放苹果
那么线程1 的操作肯定是无限循环下去,一直查询容器里面是否有苹果,有的话我就拿出来,没有我就继续循环;为了防止cpu一直被占用,线程1加上了sleep几秒后再获取,但是这样会造成获取不及时的问题,那么怎么能解决这个问题呢?
相关方法
notify:通知一个在对象上等待的线程,使其从wait方法返回(必须重新获得当前对象的锁)notifyall:通知对象上等待的所有线程wait:调用该方法后,进入waiting状态,释放当前对象锁wait(long):等待指定时间后,如果还没有被唤醒,则唤醒自己,重新获得锁后,返回主方法。
演示与流程
join是用来做什么?
如果你有这样一个需求:在多线程中,如果线程A想要等待线程B结束后,才去执行某个方法,在这种场景下,你就可以使用join方法。
探究下源码
我们可以在深入点,看下join的源码: 最终是调用wait(0),一直等待,知道被唤醒
public final void join() throws InterruptedException { join(0); } // join(0) if (millis == 0) { while (isAlive()) { wait(0); } } else {public final native void wait(long timeout) throws InterruptedException;
高频ThreadLocal的使用
threadLocal 是线程级的变量,他是一个以当前线程对key,任意对象为值的一个变量。 用法很简单 ,set 设置值,get 获取设置过的值。
为什么都说它会导致内存溢出?
注意:不要在线程池里面使用这个变量,会很容易导致内存溢出的,因为在线程池里面,线程很少会被释放的,所以它维护的变量会越来越大,除非你在任务执行后,对它做了清除操作。
使用
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~