多线程与并发程序设计

并发(Concurrency):以可独立执行的进程集合的方式编程。

并行(Parallelism):以可同时执行的(可能相关的)计算指令方式编程。

并发与并行的区别:并发是同时处理(dealing)很多的事情,并行是同时做(doing)很多的事情。不同,但也相关。一个是关于代码结构,一个是关于代码执行。并发为可能的(不是必须的)并行问题提供了一种解决方案。

Java并发包:JDK中的JUC。该工具类提供了锁、并发安全的队列和列表、线程池、线程同步器等。
数据可见性

数据的可见性:如果一个线程对于另外一个线程是可见的,那么这个线程的修改就能够被另一个线程立即感知到。

用锁保证可见性:Java内置锁(synchronized、ReentrantLock)。

synchronized可用于修饰方法、代码块。synchronized代码块是互斥访问的,只有一个线程释放了锁,另一个线程才能进入代码块中执行。

Happens-before规则:从JDK 5开始,JSR-133定义了新的内存模型,内存模型描述了多线程代码中的哪些行为是合法的,以及线程间如何通过内存进行交互。新的内存模型语义在内存操作(读取字段,写入字段,加锁,解锁)和其他线程操作上创建了一些偏序规则。

和Java锁相关的有以下两条:
内置锁的释放锁操作发生在该锁随后的加锁操作之前
一个volatile变量的写操作发生在这个volatile变量随后的读操作之前

内存溢出的三种情况
1)JVM Heap(堆)溢出:java.lang.OutOfMemoryError: Java heap space
解决方法:手动设置JVM Heap(堆)的大小。

2)PermGen space溢出: java.lang.OutOfMemoryError: PermGen space
解决方法: 通过-XX:PermSize和-XX:MaxPermSize设置永久代大小即可。

3)栈溢出: java.lang.StackOverflowError : Thread Stack space
解决方法:1:修改程序。2:通过 -Xss: 来设置每个线程的Stack大小即可。

你可能感兴趣的:(java)