T

1 线程与进程概念
2 实现多线程的两种手段,区别
3 线程状态转换
4 线程调度 优先级

并发编程的目的是为了让程序运行的更快,但并不是启动更多的线程就能让程序最大限度的并发执行。(上下文切换、死锁、硬件软件带来的资源受限问题)

上下文切换:
即使是单核处理器也支持多线程执行代码,CPU通过给每个线程分配CPU时间片来实现这个机制。时间片是CPU分配给各个线程的时间,因为时间片非常短,所以CPU通过不停地切换线程执行,让我们感觉多个线程是同时执行的,时间片一般是几十毫秒(ms)。CPU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。但是,在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。所以任务从保存到再加载的过程就是一次上下文切换。
通过减少大量waiting状态的线程减少上下文切换的次数
1.通过jstack命令dump线程信息,看看pid为3317的进程里的线程都在做什么

 sudo -u root /usr/java/jdk1.7.0_79/bin/jstack 14243 >/home/dumpTest
Paste_Image.png

2.统计所有线程分别处于什么状态,发现300多个线程处于WAITING(onobjectmonitor)状态

[root@localhost opt]# cd /home
[root@localhost home]# grep java.lang.Thread.State dumpTest | awk '{print $2$3$4$5}' | sort | uniq -c
     11 RUNNABLE
      2 TIMED_WAITING(onobjectmonitor)
      8 TIMED_WAITING(parking)
      3 TIMED_WAITING(sleeping)
      2 WAITING(onobjectmonitor)
     80 WAITING(parking)
[root@localhost home]#

volatile关键字:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。
Java支持多个线程同时访问一个对象或者对象的成员变量,由于每个线程可以拥有这个
变量的拷贝(虽然对象以及成员变量分配的内存是在共享内存中的,但是每个执行的线程还是
可以拥有一份拷贝,这样做的目的是加速程序的执行,这是现代多核处理器的一个显著特
性),所以程序在执行过程中,一个线程看到的变量并不一定是最新的。

synchronized关键字:实现同步的基础,Java中的每一个对象都可以作为锁。
具体表现为以下3种形式。
1.对于普通同步方法,锁是当前实例对象。
2.对于静态同步方法,锁是当前类的Class对象。
3.对于同步方法块,锁是Synchonized括号里配置的对象

优先级:针对频繁阻塞的线程需要设置较高优先级,对于偏重计算(需要较多cpu时间)的线程设置较低优先级,确保处理器不会被独占

你可能感兴趣的:(T)