记录一些并发的事情

定义:线程是"进程"中某个单一顺序的控制流。
一个标准的线程由线程ID,当前指令指针(PC),寄存器集合和堆栈组成。
线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,保存有进程中的虚拟地址空间,但它可与同属一个进程的其它线程共享进程所拥有的全部资源。线程的运行中需要使用计算机的内存资源和CPU。

线程的状态:
新生线程(New Thread):产生一个Thread对象就生成一个新线程。当线程处于"新线程"状态时,仅仅是一个空线程对象,它还没有分配到运行线程所必须的资源。因此只能启动或终止
它。任何其他操作都会引发异常。

可运行态(Runnable):start()方法产生运行线程所必需的的资源,调度线程运行,并且调用线程的run()方法。在这时线程处于可运行态。该状态不称为运行态是因为这时的线程并不总
是一直占用处理机。(在相同优先级下,调度顺序根据CPU时间段的分配确定)

非运行态(Not Runnable):线程被挂起或者等待等。当以下事件发生时,线程进入非运行态。
①suspend()方法被调用;
②sleep()方法被调用;
③线程使用wait()来等待条件变量;
④线程处于I/O等待。

死亡态(Dead):线程被销毁。
当run()方法返回,或别的线程调用stop()方法,线程进入死亡态。

多线程中的Volatile和synchronized
在多线程并发编程中synchronized和Volatile都扮演着重要的角色,Volatile是轻量级的synchronized,它在多处理器开发中保证了共享变量的"可见性"。
synchronized可以保证共享数据的访问互斥和可见性,volatile可以保证共享数据的可见性。(volatile针对原子操作来说)


Volatile的官方定义:java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某
些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。(Volatile不能保证访问共享变量的互斥,但是可以保证共享变量的可见性)Java语言规范保证读或者写一个变量是原子的(Atomic),除非这个变量是long或者double,这就是说,读取一个非long或double类型的变量,可以保证返回的值是某个线程保存在该变量中的,即使多个线程在没有同步的情况下并发的修改这个变量也是如此(但这些修改不能保证可见性)。

Volatile变量修饰符如果使用恰当的话,它比synchronized的使用和执行成本会更低,因为它不会引起线程上下文的切换和调度。
上下文(Context)简单说来就是一个环境,具体来说就是各个变量、数据和资源信息:寄存器变量、进程打开的文件、内存信息等
上下文(Context)的切换和调度我理解的就是挂起A线程并等待B线程运行结束

处理器为了提高处理速度,不直接和内存进行通讯,而是先将系统内存的数据读到内部缓存(L1,L2或其他)后再进行操作,但操作完之后不知道何时会写到内存,如果对声明了Volatile变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。而在在多处理器下,为了保证各个处理器的缓存是一致的,就会实现缓存一致性协议,每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器的缓存行设置成无效状态,当处理器要对这个数据进行操作的时候,会强制重新从系统内存里把数据读到处理器缓存里。


Java SE1.6中的Synchronized

在JavaSE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后
不能降级成偏向锁。
Java中的每一个对象都可以作为锁。

对于同步方法,锁是当前实例对象。
对于静态同步方法,锁是当前对象的Class对象。
对于同步方法块,锁是Synchonized括号里配置的对象。

偏向锁:
优点 加锁和解锁不需要额外的消耗,和执行非同步方法比仅存在纳秒级的差距。
确定 如果线程间存在锁竞争,会带来额外的锁撤销的消耗。
适用 适用于只有一个线程访问同步块场景。

轻量级锁
优点 竞争的线程不会阻塞,提高了程序的响应速度。
确定 如果始终得不到锁竞争的线程使用自旋会消耗CPU。
适用 追求响应时间。 同步块执行速度非常快。

重量级锁
优点 线程竞争不使用自旋,不会消耗CPU。
确定 线程阻塞,响应时间缓慢。
适用 追求吞吐量。同步块执行速度较长。


合理的配置线程池
要想合理的配置线程池,就必须首先分析任务特性,可以从以下几个角度来进行分析:

任务的性质:CPU密集型任务,IO密集型任务和混合型任务。
任务的优先级:高,中和低。
任务的执行时间:长,中和短。
任务的依赖性:是否依赖其他系统资源,如数据库连接。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值