For investors
股价:
5.36 美元 %For investors
股价:
5.36 美元 %认真做教育 专心促就业
并发编程开发技术随着互联网的不断发展而被越来越多的程序员掌握并应用,而本文我们就简单来了解一下,并发编程线程安全都需要关注哪些问题。
并发是指某个时间段内,多个任务交替执行的能力。CPU把可执行时间均匀地分成若干份,每个进程执行一段时间后,记录当前的工作状态,释放当前的执行资源并进入等待状态,让其他进程抢占CPU资源。并行是指同时处理多任务的能力。目前,CPU已经发展为多核,可以同时执行多个互不依赖的指令及执行块。
并发和并行的目标都是尽可能快执行完所有的任务,两者区别核心在于进程是否同时执行,并发环境有着以下几个特点:
并发程序之间有相互制约的关系。
并发程序的执行过程是断断续续的。
当并发设置合理并且CPU拥有足够的处理能力时,并发会提高程序的运行效率。
线程安全
我们都知道,进程是操作系统进行资源分配的独立单位,而线程是CPU调度和分派的基本单位,为了更充分地利用CPU资源,一般都会使用多线程进行处理。多线程的作用是提高任务的平均执行速度。
线程可以拥有自己的操作栈、程序计数器、局部变量表等资源,它与同一进程内的其他线程共享该进程的所有资源。线程在生命周期内存在多种状态,分别为NEW(新建状态)、RUNNABLE(就绪状态)、RUNNING(运行状态)、BLOCKED(堵塞状态)、DEAD(死亡状态)五种状态。
在计算机的线程处理过程当中,因为每个线程轮流占用CPU的计算资源,可能会出现某个线程尚未执行完就不得不中断的情况,容易导致线程不安全。例如,在服务端某个高并发业务共享某用户数据,先A线程执行用户的查询任务,但是查询出来的数据还未返回就退出CPU时间片;然后后面进来的B线程抢占了CPU资源并覆盖了该用户数据,后A线程重新执行,将B线程修改过后的数据返回给前端,导致页面出现数据异常。所以,为了保证线程安全,在多个线程并发地竞争共享资源时,通常采用同步机制协调各个线程的执行,确保得到正确的结果。
线程安全问题只在多线程环境下出现,单线程串行执行并不会存在此问题。为了保证高并发场景下的线程安全,可以从以下四个维度来探讨:
(1)数据单线程内可见。单线程总是安全的。通过限制数据仅在单线程内可见,可以避免数据被其他线程篡改。的就是线程局部变量,它存储在独立虚拟机栈帧的局部变量表中,与其他线程毫无瓜葛。ThreadLocal就是采用这种方式来实现线程安全的。
(2)只读对象。只读对象总是安全的。它的特性是允许复制、拒绝写入。的只读对象有String、Integer等。一个对象想要拒绝任何写入,必须要满足以下条件:使用final关键字修饰类,避免被继承;使用privatefinal关键字避免属性被中途修改;没有任何更新方法;返回值不能为可变对象。
(3)线程安全类。某些线程安全类的内部有非常明确的线程安全机制。比如StringBuffer就是一个线程安全类,它采用synchronized关键字来修饰相关方法。
(4)同步与锁机制。如果想要对某个对象进行并发更新操作,但又不属于上述三类,需要开发者在代码中自定义实现相关的安全同步机制。
线程安全的核心理念就是“要不只读,要不加锁”。JDK提供的并发包,主要分成以下几个类族:
(1)线程同步类。这些类使线程间的协调更加容易,支持了更加丰富的线程协调场景,逐步淘汰了使用Object的wait()和notify()进行同步的方式。主要代表有CountDownLatch、Semaphore、CyclicBarrier等。
(2)并发集合类。集合并发操作的要求是执行速度快,提取数据准。的莫过于ConcurrentHashMap,经过不断的优化,有刚开始的分段式锁到后来的CAS,不断的提高并发性能。除此之外,还有ConcurrentSkipListMap、CopyOnWriteArrayList、BlockingQueue等。
(3)线程管理类。虽然Thread和ThreadLocal在JDK1.0就已经引入,但是真正把Thread的作用发挥到极致的是线程池。根据实际场景的需要,提供了多种创建线程池的快捷方式,如使用Executors静态工厂或者使用ThreadPoolExecutors等。另外,通过ScheduledExecutorService来执行定时任务。
(4)锁相关类。锁以Lock接口为核心,派生出一些实际场景中进行互斥操作的锁相关类。有名的是ReentrantLock。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。