线程安全的概念:就是当多个线程同时访问同一个类(对象或方法)时,这个类始终都能保持正确的行为,那个这个类(对象或方法)就是线程安全的。
synchronized :可以在任意的对象及方法上加锁,而加锁的代码块被称为“互斥区”或“临界区”。
加锁的代码(重写run方法并且加上synchronized方法)
public class MyThread extends Thread {
private int count = 5;
//synchronized加锁
public synchronized void run() {
count--;
System.out.println(this.currentThread().getName() + "count = " + count);
}
public static void main(String [] args){
/**
* @Author: Ming
* @param: args
* @Description: 当多个线程同时访问run的时候,会以排队的方式进行处理(按照CPU分配的先后顺序而定)
* 1.尝试获得锁
* 2.如果拿到锁,就是执行run方法,拿不到锁,这个线程就会不断地尝试去获得这把锁,知道拿到为止,而且是多个线程同时去竞争这把锁
* ,这里有涉及到锁竞争
* @Date: 14:15 2017/3/22
*/
MyThread myThread = new MyThread();
Thread t1 = new Thread(myThread,"t1");
Thread t2 = new Thread(myThread,"t2");
Thread t3 = new Thread(myThread,"t3");
Thread t4 = new Thread(myThread,"t4");
Thread t5 = new Thread(myThread,"t5");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
}
}
显示
t1count = 4
t3count = 3
t5count = 2
t2count = 1
t4count = 0
如果不加锁则是显示
t1count = 2
t2count = 1
t5count = 0
t3count = 2
t4count = 1