您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 质量控制/管理 > Java高并发程序设计
Java高并发程序设计第一课前沿•在计算密集型的领域中非常适用并行程序•多核CPU的产生促使了并行程序的设计,摩尔定律的失效,芯片的性能不能提高,4GHz已经是当下最高的频率,从而产生多核CPU的出现。•活锁:两个资源A、B,进程1和2分别占用A和B时发现不能工作,就同时释放掉,然后又同时分别占用B和A如此反复!出现活锁•阻塞:第二课Java并行程序基础•线程是比进程更细粒度的执行单元,可以说是属于进程的一个子集•7,Thread类的run()方法实现于Runnable接口,如果直接调用run()方法,不会启动新的线程,而是在当前线程下运行,start()方法会开启一个新的线程。两种方式,1重载run方法2,实现Ruanable接口8,Thread.Interrupt()是一种比较的让线程终止的方法优雅的方法,不会立刻停止掉该程序,根据程序的设计,而是根据该程序的设计,当执行完该程序的一次循环之后,在下次循环程序开始之前中断,保证该程序的数据完整性。9,try{Thread.sleep(2000);}catch(InterruptedExceptione){////设置中断状态,抛出异常后会清除中断标记位e.printStackTrace();}10,查看当前被挂起的进程命令jps查看进程中具体线程的信息jstack588011,•等待线程结束join(),其本质是判断线程是否还存活,如果一直存活那么通知调用该线程的其他线程等待,如果结束有JVM调用notifyAll()唤醒所有等待该线程的线程。f(millis==0){while(isAlive()){wait(0);}}•谦让yield()12,守护线程在后台默默的完成一些系统性的服务,比如垃圾回收与JIT线程等。但非守护线程结束时,JVM不会因为守护线程而继续执行,随之而推出。13,线程优先级的运行时候只是在概率上发生的可能下要大!14,synchronized加锁的三种方式。•对象实例加锁•实例方法加锁•类级别实例方法加锁第三课Java内存模型和线程安全•同一个操作在两条不同的指令之间是不能够一起做的,因为他们会使用同一个硬件设备.•可见性问题是各个层面优化产生的••Java并发编程的的三个重要的概念。原子性可见性有序性,并发程序会发生指令重排,导致语句执行顺序发生变化的情况,虽然处理器会对指令进行重排序,但是它会保证程序最终结果会和代码顺序执行结果相同;指令重排序不会影响单个线程的执行,但是会影响到线程并发执行的正确性。•要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。第四课无锁•无锁的性能要远好于阻塞的执行方式•前导零是指转换成二进制的时候前面为零的个数(LeadingZeros)•无锁实现Stack堆栈,见作业第五课JDK并发包11.Reentrantlock是属于Synchronized的增强版,多增加了一些特有的功能2.ConcurrentHashMap属于高并发的解决方案3.HashMap发生大量冲突的时候,会退化成一个链表,引起性能降低4.BlockingQueue阻塞队列,会引起线程的阻塞,不是一个高性能的并发实现,内部实现机制采用了加锁,同时只有一个线程进入第六课JDK并发包21,线程池实现了对线程的复用,避免了线程的多次创建和销毁,节省了CPU处理时间。2,Java内置线程池,Callable与Runnable的区别是有无返回值3,ForkJoinPool说明该线程池是如何工作的第七课设计模式1,采用静态内部类来实现单例模式,可以保证在StaticSingleton类中只调用getInstance()方法时才会初始化类,从而保证了在操作该类其他字段的时候,不会被初始化。第八课NIOAIO第九课锁的优化1,每一个对象都会保存一个对象头信息对象头Mark,主要包括对象的Hash,锁信息,垃圾回收信息,年龄等信息。2,Integeri对象是不可变对象,如果进行i++操作,会new出一个新的对象去++操作并把应用赋值给i。3,ThreadLocal对象使得每个线程都有自己的实例对象可以访问,从而他彻底的避免了锁带来的问题,
本文标题:Java高并发程序设计
链接地址:https://www.777doc.com/doc-2881696 .html