JAVA中,创建线程的方式有三种
第一种:继承Thread 复写run方法
第二种:实现Runnable 覆写run方法
第三种:实现Callable 覆写call方法
最常用的是第二中方法
区别:第二种和第三种方法的区别在于返回值,run方法是没有返回值的,但是call方法是可以带返回值
线程生命周期
1.new 新建
2.调用start方法 就绪
3.获取资源 运行
4.资源不足或者未获取资源 阻塞
5.执行完毕 死亡
线程安全解决方法:四种
1.同步代码块 即使用
synchronized(obj){
需要保证安全的代码
}
2.同步方法 即在方法上加上同步修饰词
eg: synchronized 返回类型 方法名(参数){方法体}
注:该方式默认使用this也就是当前对象作为同步锁的监听器
3.静态方法
因为静态方法在内存中是唯一存在的,所以使用静态方法可以保证同一时间只会被一个线程所使用
4.同步锁 Lock
此方法是jdk1.5后才拥有的,老古董的项目用不了
在创建对象时,创建一个同步锁,然后在需要保证线程安全的方法内调用lock方法,方法运行结束后调用unlock方法解锁
此方法默认使用Lock对象作为监听器
eg:
public class X {
//创建一个同步锁,通常使用ReentrantLock(可重入锁)。使用该对象可以显示地加锁和解锁
private final ReentrantLock lock = new ReentrantLock();
//需要保证线程安全的方法
public void m(){
//加锁
lock.lock();
try{
//... method body
}finally{
//在finally释放锁
lock.unlock();
}
}
}