近日把《Java并发编程》撸了一遍,虽然还有很多还没看懂,先来个总结吧。
主要API
- start()和run()的区别:直接调用run不会开启新线程,只当是普通方法。
- currentThread()获取当前线程名 isLive()方法判断当前线程是否处于活动状态。
sleep()和notify()方法使用后都不释放锁,而wait()和join()使用后立即释放锁。
getId()方法的作用是取得线程的唯一标识。
this.interrupt()测试当前线程是否中断,执行后具有把状态标志位清除为FALSE的功能
this.isInterrupt()测试线程是否已经中断,不具有清除功能
- yield()表示放弃当前CPU资源,让给其他任务去执行CPU,但释放时间不确定,有可能刚放弃,有重新获得cpu。
- setPriority()设置线程优先级
- 守护线程,当进程中不存在非守护线程后,当场销毁
对象及变量的并发访问
synchronized可以防止脏读现象出现,还可以实现可重入锁
public class Service {
synchronized public void service1() {
System.out.println("service1");
service2();
}
synchronized public void service2() {
System.out.println("service2");
service3();
}
synchronized public void service3() {
System.out.println("service3");
}
}
- synchronized锁定方法有一个很大的弊端,就是锁的粒度太大,造成性能的下降,所以一般同步代码块就好
public class ObjectService {
public void serviceMethod() {
try {
synchronized (this) {
System.out.println("begin time=" + System.currentTimeMillis());
Thread.sleep(2000);
System.out.println("end end=" + System.currentTimeMillis());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
- 由于String存在常量池,一般同步代码块都不用string作为锁对象。
- volatile保证的是可见性,并没有实现原子性。