对Java并发编程的思考和总结(一)

版权声明:转载请加链接 https://blog.csdn.net/banbanbanzhuan/article/details/79945950

近日把《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保证的是可见性,并没有实现原子性。
阅读更多

没有更多推荐了,返回首页