JAVA如何开启线程? 怎么保证线程安全?
(引入JUC部分)
线程和进程的区别:进程是操作系统进行资源分配的最小单元。线程是提作系统进行任务分配的最小单元,线程隶属于进程。
有四种开启线程的方式
1、继承Thread类,重写run方法,2、实现Runnable接口,实现run有法。3、实现Callable接口,实现call方法。通过FutureTask创建一个线程,获取到线程执行的返回值。4、通过线程池来开启线程。
保证线程安全的方式就是加锁
1、JVM提供的锁,也就是Synchronized关键字。 2、JDK提供的各种锁 Lock。
不加锁保证线程安全
有个无锁并发的概念,有三种方法可以实现:
1、通过自旋锁(CAS),线程在没有抢占到锁的情况下,会不断自旋尝试获取锁,直到到达最大自旋次数。
2、乐观锁,给每个数据增加一个版本号,每次数据变化就去修改这个版本号,Java中有个CAS机制可以实现该功能。
3、在程序设计中,尽可能减少共享对象的一个使用,从业务上实现隔离避免并发。