1、什么是重入锁
所谓重入锁,指的是以线程为单位,当一个线程获取对象锁之后,这个线程可以再次获取本对象上的锁,而其他的线程是不可以的。
常用在线程需要多次进入锁内执行任务。
2、线程同步需要注意什么
1、尽量缩小同步的范围,增加系统吞吐量。
2、分布式同步锁无意义,要使用分布式锁。
3、防止死锁,注意加锁顺序。
3、什么是乐观锁和悲观锁?
悲观锁:对数据的修改持悲观态度,每次读取数据的时候都默认其他线程会更改数据,因此需要进行加锁操作,当其他线程想要访问数据时,都需要阻塞挂起。
悲观锁主要分为共享锁和排他锁:
共享锁【shared locks】又称为读锁,简称S锁。顾名思义,共享锁就是多个事务对于同一数据可以共享一把锁,都能访问到数据,但是只能读不能修改。
排他锁【exclusive locks】又称为写锁,简称X锁。顾名思义,排他锁就是不能与其他锁并存,如果一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁,包括共享锁和排他锁,但是获取排他锁的事务是可以对数据行读取和修改。
悲观锁实际上是“先取锁再访问”的保守策略,为数据处理的安全提供了保证。但是在效率方面,处理加锁的机制会让数据库产生额外的开销,还有增加产生死锁的机会。另外还会降低并行性,一个事务如果锁定了某行数据,其他事务就必须等待该事务处理完才可以处理那行数据。
乐观锁:乐观锁是相对悲观锁而言的,乐观锁假设数据一般情况下不会造成冲突,如果发现冲突了,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。
4、什么是自旋锁
由于在多处理器的环境中某些资源的有限性,有时需要互斥(同一时刻只能有一个线程可以访问)访问,这时候就需要引入锁的概念,只有获取到锁的线程才能对临界资源进行访问,由于多线程的核心是CPU的时分片,所以同一时刻只能又一个线程获取到锁。但是那些没有获取到锁的线程该怎么办呢?
有两种解决办法,一种是没有获取到锁就一直等待判断该线程是否释放锁,它不会引起阻塞,可以避免线程切换带来的开销,这种就是自旋锁。
还有一种就是没获取到锁就把自己阻塞起来,重新等待cpu调度,这就是互斥锁。
5、java多线程中的死锁、活锁、饥饿、无锁都是什么鬼?
死锁:多个线程相互占用对方的资源的锁,而又相互等对方释放锁,此时若无外力干预,这些线程则一直处于阻塞的假死状态,形成死锁。
活锁:活锁恰恰与死锁相反,死锁是大家都拿不到资源都占用着对方的资源,而活锁是拿到资源却又相互释放不执行。当多线程中出现了相互谦让,都主动将资源释放给别的线程使用,这样这个资源在多个线程之间跳动而又得不到执行,这就是活锁。
饥饿:如果优先级高的线程一直抢占优先级低线程的资源,导致低优先级线程无法得到执行,这就是饥饿。与死锁不同的是饥饿在以后一段时间内还是能够得到执行的,如那个占用资源的线程结束了并释放了资源。
无锁:即没有对资源进行锁定,即所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功。无锁典型的特点就是一个修改操作在一个循环内进行,线程会不断的尝试修改共享资源,如果没有冲突就修改成功并退出否则就会继续下一次循环尝试。
6、什么是原子性、可见性、有序性
原子性是指一个操作是不可中断的,要么全部执行成功要么全部执行失败,有着“同生共死”的感觉。即使在多个线程一起执行的时候,一个操作一旦开始,就不会被其他线程所干扰。
可见性是指某个线程修改了某一个共享变量的值,而其他线程可以看见该共享变量修改后的值。如果线程A需要看到共享变量才会结束,而线程B和A之间是不可见的,那么线程A可能永远不会终止。
有序性是指在java内存模型中,允许编译器和处理器对指令进行重排序。也就是说虽然java程序是按顺序执行,但是为了提高性能,jvm和操作系统可能都会对代码顺序进行重排序。指令重排后势必会影响多线程的执行结果。
7、为什么要用线程池
为了节省资源,降低内存消耗。
有四种线程池,分别是newSingleThreadExecutor、newFixedThreadPool、newCachedThreadPool、newScheduledThreadPool。
newSingleThreadExecutor是单线程的线程池,这个线程池只有一个线程在工作。
newFixedThreadPool 创建固定大小的线程池。
newCachedThreadPool 创建一个可缓存的线程池。
newScheduledThreadPool 创建一个大小无限的线程池。
8、为什么使用Java虚拟机
为了实现java语言的平台无关性,也就是一次编译到处运行。主要是通过jvm虚拟机来实现不同平台的相同执行。
本文详细介绍了Java并发编程中的重入锁、线程同步注意事项、乐观锁与悲观锁的区别、自旋锁的概念以及死锁、活锁、饥饿和无锁的状态。同时,探讨了线程池的使用目的和不同类型的线程池,强调了使用线程池以节省资源的重要性。此外,还解释了原子性、可见性和有序性在多线程环境中的含义。
418

被折叠的 条评论
为什么被折叠?



