111 Java并发编程

核心理论  

共享性,互斥性,原子性,可见性,有序性html

http://www.cnblogs.com/paddix/p/5374810.htmljava

 

*********  https://mp.weixin.qq.com/s/anqQfO7bWpNTcS6Po4Rkww并发

 

Synchronized及其实现原理 http://www.cnblogs.com/paddix/p/5367116.html异步

Synchronized是Java中解决并发问题的一种最经常使用的方法,也是最简单的一种方法。Synchronized的做用主要有三个:(1)确保线程互斥的访问同步代码(2)保证共享变量的修改可以及时可见(3)有效解决重排序问题。从语法上讲,Synchronized总共有三种用法:ide

  (1)修饰普通方法性能

  (2)修饰静态方法优化

  (3)修饰代码块spa

每一个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的全部权,过程以下:.net

一、若是monitor的进入数为0,则该线程进入monitor,而后将进入数设置为1,该线程即为monitor的全部者。线程

二、若是线程已经占有该monitor,只是从新进入,则进入monitor的进入数加1.

3.若是其余线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再从新尝试获取monitor的全部权。

执行monitorexit的线程必须是objectref所对应的monitor的全部者。

指令执行时,monitor的进入数减1,若是减1后进入数为0,那线程退出monitor,再也不是这个monitor的全部者。其余被这个monitor阻塞的线程能够尝试去获取这个 monitor 的全部权。 

所以 Synchronized的语义底层是经过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为何只有在同步的块或者方法中才能调用wait/notify等方法,不然会抛出java.lang.IllegalMonitorStateException的异常的缘由。

 

Synchronized底层优化(偏向锁、轻量级锁) 

轻量级锁所适应的场景是线程交替执行同步块的状况,若是存在同一时间访问同一锁的状况,就会致使轻量级锁膨胀为重量级锁。

偏向锁则是在只有一个线程执行同步块时进一步提升性能。

http://www.cnblogs.com/paddix/p/5405678.html

 

线程间的协做(wait/notify/sleep/yield/join)

http://www.cnblogs.com/paddix/p/5381958.html

 

volatile的使用及其原理

http://www.cnblogs.com/paddix/p/5428507.html

说白了volatile修饰的变量,JVM保证了每次读变量都从主内存中读,而不是从主内存中copy到线程中到副本,不会由于两份不一致致使,提供可见行。

当线程操做对volatile变量进行写操做时,JMM会将该线程的本地内存中的副本变量刷新到主存中去;当线程对volatile变量进行读操做时,线程先将本地内存共享变量设置为无效,线程就会从主存中读取共享变量的值了。

编译器不会对volatile修饰的变量指令进行重排,保证顺序一致性。

但它不能保证一致性

 

实现线程的方式:主要使用Runnable,Callable,Thread或者线程池。

class ThreeCallable implements Callable<Integer>{

    @Override

    public Integer call() throws Exception {

        int i = 0;

        for(;i<100;i++)

        {

            System.out.println(Thread.currentThread().getName()+" "+i);

        }

        return i;

    }

}

ThreeCallable threeCallable = new ThreeCallable();

FutureTask<Integer> ft = new FutureTask<Integer>(threeCallable);

new Thread(ft).start();

System.err.println("ft:"+ft.get());

Runnable,Callable的区别?

  1. 实现方法名称不同,Callable规定的方法是call(),Runnable规定的方法是run()。

  2. Callable的任务执行后可返回值,而Runnable的任务是不能返回值得。

  3. call()能够抛出异常,run()不能够。

  4. 运行Callable任务能够拿到一个Future对象,表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并检索计算的结果。经过Future对象能够了解任务执行状况,可取消任务的执行,还可获取执行结果。

相关文章
相关标签/搜索