前言
文章是由本人阅读葛一鸣的《JAVA高并发程序设计》所做的记录,详情请阅读作者书籍
创建线程
1.start方法开启线程会新建一个线程并且让这个线程执行run方法
2.run方法开启线程不会创建新的线程,只会在当前线程串行执行run中的代码
终止线程
1.stop会强行把执行一半的线程终止,并且释放所。(容易造成程序执行一半就结束了,造成错误)
线程中断
1.public void Thread.interrupt; //中断线程
2.public boolean Therd.isInterrupted; //判断线程是否被中断
3.public static boolean Thread.interrupted;//判断是否被中断,并清除当前中断状态
设置中断标志后线程并不会停止执行,需要自定义相应的中断代码。
等待线程结束(join)和谦让(yield)
public final void join() throws InterruptedExcption;//无限等待,直到目标线程执行完毕
public final synchronized void join(long mills) throws InterrupteException; //设置最大等待时间,超过时间则直接执行
public static native void yield();//执行此方法后,当前线程会让出cpu,之后还会进行cpu抢夺,却不一定抢夺的到
volatile关键字
1.使用volatile关键字修饰变量会使虚拟机注意此变量的修改,如果未使用此关键字,当变量修改时,其他线程无法发现,使用volatile后,其它线程会发现。
2.volatile并不能保证一些复合操作的原子性。
3.使用volatile标识变量,可以在已运行的程序中动态的修改变量
线程组(ThreadGroup)
1.如果线程比较多,功能分配明确,可以使用线程组管理线程
守护线程
1.是系统的守护者,比如垃圾回收线程。
2.守护线程的优先级比较低,用于为系统中的其它对象和线程提供服务。
3.当线程只有守护线程的时候,jvm就会退出。
4.Thread.setDaemon必须设置在Thread.start前,否则会报异常,显示守护线程设置失败。但是程序会依然正常执行,守护线程也会被当做用户线程
线程优先级
1.Thread.setPriority(参数),由低到高,1-10.数字越大优先级越高
同步锁(synchronized)
1.指定枷锁对象:对给定对象加锁,进入同步代码前要获得给定对象锁。
2.直接作用于实例方法:相当于对当前实例加锁,进入同步代码前要获得给定对象锁。
3.直接作用于静态方法:相当于对当前类加锁,进入同步代码前要获得给定对象锁。
4.线程同步,线程安全,保证线程的可见性,有序性
并发下的ArrayList
1.下标越界异常:ArrayList扩容时,另一个线程访问到不一致的内部状态。
2.数据错误:两个线程同时对一个下标进行赋值。
并发下的HashMap
1.同ArrayList,两个线程同时对Map进行赋值。
2.死循环,链表遭到破坏,形成环路(jdk8已改善)