Java如何开启线程?怎么保证线程安全?

线程和进程的区别进程是操作系统进行资源分配的最小单元。线程是操作系统进行任务调度分配的最小单元,线程隶属于进程。 如何开启线程? 继承Thread类,重写run方法。 实现Runnable接口, 实现run方法。 实现Callable接口, 实现call方法。通过FutureTask创建一个线程,获取到线程执行的返回值。 通过线程池来开启线程。 怎么保证线程安全?加锁 JVM提供的锁...
并发

Java并发之Unsafe类

Unsafe是位于sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升Java运行效率、增强Java语言底层资源操作能力方面起到了很大的作用。但由于Unsafe类使Java语言拥有了类似C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用Unsafe类会使得程...
并发

继承Thread和实现Runnable的区别

当使用继承的时候,主要是为了不必重新开发,并且在不必了解实现细节的情况下拥有了父类我所需要的特征。它也有一个很大的缺点,那就是如果我们的类已经从一个类继承(如小程序必须继承自 Applet 类),则无法再继承 Thread 类, Java只能单继承,因此如果是采用继承Thread的方法,那么在以后进行代码重构的时候可能会遇到问题,因为你无法继承别的类了,在其他的方面,两者之间并没什么...
并发

多线程Future的用法

在并发编程时,一般使用runnable,然后扔给线程池完事,这种情况下不需要线程的结果。 所以run的返回值是void类型。 如果是一个多线程协作程序,比如斐波那契数列,1,1,2,3,5,8…使用多线程来计算。但后者需要前者的结果,就需要用callable接口了。callable用法和runnable一样,只不过调用的是call方法,该方法有一个泛型返回值类型,你可以任意指定。 线程是...
并发

线程间通信问题

wait/notify/notifyAll wait()、notify/notifyAll() 方法是Object的本地final方法,无法被重写。 wait()使当前线程阻塞,前提是 必须先获得锁,一般配合synchronized 关键字使用,即,一般在synchronized 同步代码块里使用 wait()、notify/notifyAll() 方法。 由于 wait()、not...
并发

线程上下文切换

简介多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。当一个线程的时间片用完的时候就会重新处于就绪状态让给其他线程使用,这个过程就属于一次上下文切换。 概括来说就是: 当前任务在执行完 CPU 时间片切换到另一个任务之前会先保存自己的状态,以便下次再...
并发

初识CAS与ABA问题

什么是CAS?CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。CAS需要有3个操作数:内存地址V,旧的预期值A,即将要更新的目标值B。 CAS指令执行时,当且仅当内存地址V的值与预期值A相等时,将内存地址V的值修改为B,否则就什么都不做。整个比较并替换的操作是一个原子操作。它体现的一种乐观锁的思想,比如多个线程要对一个共享的整型变量执行 +1 操作 获取共享变量...
并发

异步回调

To be continue…

并发

ForkJoin

ForkJoin 在JDK1.7, 并行执行任务! 在大数据量下提高效率。

并发

线程之间同步的机制

待完善…

并发