线程 : 是操作系统能够进行运算调度的最小单位。它 被包含在进程之中,是进程中的实际运作单位。
一 条线 程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行
不同 的任务。线程的声明周期
新建(New)->就绪(Runnable)->运行(Running)->阻塞(Block)->死亡(Dead)
3.synchronized当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行
该段代码。
synchronized锁的使用方法
注意加锁会降低效率,所有存在一个加锁层级的问题:
1.代码锁,对代码级进行加锁
2.方法锁,对方法进行加锁
3.对象锁,对对象的所有资源进行加锁
synchronized后传的参数是加锁对象,就是说锁与这个对象绑定,
锁并不单独存在,一个对象只能绑定一个锁
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
@Override
public void run() {
synchronized(对象){需要加锁的代码}
synchronized (this) {
count = count + 1;
}}
}).start();
volatile
1、volatile关键字为域变量的访问提供了一种免锁机制
2、使用volatile修饰域相当于告诉虚拟机该域可能会被其他线程更新
3、因此每次使用该域就要重新计算,而不是使用寄存器中的值
4、volatile不会提供任何原子操作,它也不能用来修饰final类型的变量
volatile static int count = 0;
for (int i = 0; i < 100; i++) {
new Thread(new Runnable() {
public void run() {
count++;
}
}).start();
先让线程休眠一秒钟
try {
Thread.sleep(1 * 1000);
} catch (Exception e) {
e.printStackTrace();
}