java多线程总结

https://www.cnblogs.com/wxd0108/p/5479442.html

  1. 并行和并发:并行是在多核上真正同时运行;并发是表面上的同时运行,单核也可以并发。
  2. 线程和进程:进程的隔离程度更高,线程共享的东西更多:I/O资源,代码段。
  3. 乐观锁和悲观锁:假设线程在读的时候没有其他线程会写数据,所以在读操作时不会加锁,只有在写的时候会加锁。悲观锁总是做最坏的假设,读写都会加锁。读取频繁使用乐观锁,写入频繁使用悲观锁。
  4. sleep\yield \join\wait
  1. 有一点容易混淆的东西需要特别说明:在多线程的程序运行之后,各个线程在竞争的有两种资源:一个是cpu资源,一个是锁资源。sleep\yield\join是针对于cpu资源而讲的;wait则是针对于锁资源和cpu资源而讲的。
  2. sleep:让当前线程暂停执行。
  3. yield:使当前线程重新回到可执行状态,所有线程(包括yield线程)重新竞争计算资源。
  4. join:t1.join( )将计算资源转交给t1,等待t1执行完毕再执行当前线程。
  5. wait:释放锁标志,等待其他线程调用对象的notify。wait方法必须在synchronized函数或synchronized block中。
  1. 系统线程和java线程的区别。

https://blog.csdn.net/cringkong/article/details/79994511

 

用户级线程

内核级线程

概念

在程序内实现线程的一系列概念。计算资源是以进程为单位进行分配的,当程序进程拿到计算资源后,程序本身再做计算资源的再分配。

程序员直接使用操作系统中实现的线程,线程的创建销毁靠操作系统,程序员需要的只是系统调用。windows中存在线程这一数据结构,而linux直接采用和进程一样的实现,叫做轻量级进程(LWP)。

优点

1.不需要切入内核态,节省切入内核态的时间(内核态拥有更多的权限,可以访问内存中任意的物理地址)

1.同一个进程的多个线程可以同时运行。

  1. 多线程的实现包括只使用用户级线程(N:1)、只使用内核级进程(1:1)和两种混合(M:1)三种方式
  2. java使用的是用户级线程实现还是内核级别的线程,取决于具体的虚拟机实现,实现方式对上层编程是透明的,但是主流方案是使用内核级线程。
  1. 计算资源的最小分配单位是核还是线程?四核八线程的处理器可不可以同时分配给八个进程?
  2. synchronized同步的是类级别还是对象级别?

http://ilan520.com/ConItem.aspx?29AF0=0B47CDA2F3043AD51A75548BFD326278

static方法是对象级别,信号量是object,即两个实例的同步代码是可以同时运行的。如果方法是static的,则同步的级别是类级别,信号量是class

  1. 可重入锁:ReentrantLocksynchronize都是可重入锁,可重入性体现在获取锁方法可以递归调用:如果method1method2是同一个类的synchronize方法,在method1中执行时可以直接进入method2
  2. 可中断锁:Thread1正在等待获取锁执行同步代码的时候,如果这个等待是可以中断的,那么锁就是可中断锁。Lock是可中断锁,synchronize是不可中断锁。
  3. 公平锁:最先等待的线程最先获取锁。synchronize不是公平锁,Lock默认是不公平锁,可以配置为公平锁。
  4. violate

https://www.cnblogs.com/dolphin0520/p/3920373.html

         每个线程会有自己的高速缓存,这样在多线程操作时会出现可见性的问题,变量使用violate关键字之后,对变量的每个更改都会同步到主存中。

  1. interrupt
  2. Atomic
  3. 常用的同步集合:
  4. 活动对象:
  5. notify()/notifyAll()

怎样创建多线程

执行内容的创建和线程执行时两件事

Thread:

创建:继承Thread类,实现run方法。

执行:thread.start()。

Runnable:

创建:实现Runnable 接口,实现run方法

执行:最基础的用法是new Thread(Runnable).start(),推荐使用ThreadPool创建:Executors.newFixedThreadPool(5).execute(Runnable);

Callable:

创建:实现Callable接口,实现call方法。

执行:Executors.newFixedThreadPool(5).submit(Callable);

怎样解决资源竞争

无论是什么样的语法形式,最终的实现方式肯定是依赖于信号量和在信号量上的原子操作实现的!!!

  1. synchronize:分为synchronize方法和synchronize代码块两种。
  2. Lock: https://www.cnblogs.com/baizhanshi/p/6419268.html

lock和synchronize实现的效果基本相似,但是synchronize只是一个关键字,Lock却是一个类,是一个类,就意味着可以提供更多的功能。在下列情况下synchronize不能满足需求,需要使用Lock。

    1. 不想无期限的一直等待获取锁:  Lock. lockInterruptibly( )/Lock. tryLock( )
    2. 需要公平锁: new ReentrantLock(true)
    3. 需要乐观读锁(ReadWriteLock)

Lock虽然使用起来更加灵活,但是需要手动释放锁,所以使用的时候出现问题的可能性就更大,所以在synchronize能够满足需求的时候应该优先使用synchronize。

怎样协调线程

https://www.jianshu.com/p/be2dc7c878dc

synchronize和Object.wait( )/Object.notify( )/Objetc.notifyAll( )搭配。

Lock和Condition.await( )搭配。

java多线程总结

java多线程总结