关于多线程的一些问题(java)

1人阅读 评论(0) 收藏 举报
分类:

多线程

java中有几种方法可以实现一个线程?

总共有四种方法。

1.继承Thread类,此种实现方式好处是可以用父类中的一些方法对多线程进行控制

2.实现runnable接口,此种方法比较轻量,只需在runnable中实现run方法即可,并且还可继承其他父类

3.实现callable接口,增添了一个回调函数,返回future,使用futeure.get获取返回值,为非阻塞方式

4.将实现的runnable接口或callable接口扔进线程池

如何停止一个正在运行的线程?

1.在run方法中设置钩子(一个volatile的stop标志),这样通过外部可以关闭掉循环的线程

2.使用interrupt方法终止,相当于为线程添加中断标志

3.使用stop方法暴力终止

notify()和notifyAll()有什么区别?

notify是随机唤醒一个正在等待的线程

notifyAll是唤醒所有等待线程

sleep()和 wait()有什么区别?

1.从属类不同,sleep方法是Thread类的静态方法,wait方法是Object类的类方法

2.对锁的方式不同,sleep方式不会释放锁,但是wait方法会释放锁,被notify唤醒时会进入锁的阻塞队列

3.sleep必须指定时间,没有唤醒方法,而wait可以用notify或notifyAll方法唤醒

什么是Daemon线程?它有什么意义?

Daemon线程又称守护线程,就是当用户线程关闭时,即使还有守护线程没有关闭,虚拟机也会自动退出。他的意义是可以用于一些后台线程,比如垃圾回收,当用户线程都退出,gc也没什么用了,所有也会自动退出。

java如何实现多线程之间的通讯和协作?

1.共享内存:通过共享堆中的内存,可以使线程之间进行通信

2.互斥锁:对线程进行同步控制

3.

什么是可重入锁(ReentrantLock)?

可重入锁即当当前线程获取到了A锁,此时它可以在进入A锁,这时A锁会维护一个值,当此线程进入时+1,当此线程释放时-1,当为0时可以被其他线程获取

当一个线程进入某个对象的一个synchronized的实例方法后,其它线程是否可进入此对象的其它方法?

分情况

1.当其他方法也是synchronized的实例方法时,其他线程因为不能获取到锁,会被阻塞,当上一个获取到实例锁的线程释放锁之后,即可进入

2.当其他方法没有被synchronized修饰,自然可以进入

synchronized和java.util.concurrent.locks.Lock的异同?

一般用ReentranLock与synchronized进行对比,因为读写锁也实现了Lock接口,但是synchronized没有与其对应的方法

1.synchornized:可用在类方法,对象方法,代码块中。类方法中加的锁是类,对象方法的锁是对象,代码块中可以指定锁。此种加锁当线程发生异常会自动释放锁。且分为偏向锁,轻量级锁,重量级锁

2.ReetranLock:可显式进行加锁,且可用condition类进行通信协调(condition类主要是用于维护一个condition队列,当调用await方法即将当前线程从AQS队列移到对应的condition队列)。其需要自己释放锁,所以一般会在其获取所之后加try finally,在finally中释放锁。且其可以设置是否为公平锁,默认为非公平锁

乐观锁和悲观锁的理解及如何实现,有哪些实现方式?

1.乐观锁:假定不会出现冲突,当检测到出现冲突进行重试,重试次数过多转化为悲观锁。一般都为数据添加一个版本号,当检测到版本号修改则发生冲突,还有就是CAS操作

2.悲观锁:假定会发生冲突,一切都以数据完整性为前提。一般实现可以直接用加独占锁实现

并发框架

SynchronizedMap和ConcurrentHashMap有什么区别?

1.SynchronizedMap是对所有方法添加了互斥锁,这样肯定可以保证强一致性

2.ConcurrentHashMap在1.7主要是使用锁段机制,对不同的段区加不同的锁,这样的话将锁的力度减小。在1.8主要使用CAS操作,在操作同一个hash值得链时会进行加锁保证线程安全。为size添加volatile标志,使用cas操作统计其长度

CopyOnWriteArrayList可以用于什么应用场景?

一般用于读多写少的使用场景,比如白名单,黑名单等,因为其在读的时候不会进行加锁,写的时候才会进行加锁拷贝数据,在写的时候如果有线程去读可能会读到旧数据

线程安全

什么叫线程安全?servlet是线程安全吗?

允许被多个线程同时执行(不会出现同步问题)的代码叫线程安全的代码。servlet不是线程安全的,因为如果有多个http请求,此时会有多个线程调用其service方法,此时如果有静态变量和实例变量就会产生线程安全问题

同步有几种实现方法?

1.synchronized

2.ReentranLock

3.CountDownLatch

4.CyclicBarrier

5.Semaphore

volatile有什么用?能否用一句话说明下volatile的应用场景?

保证变量的可见性与禁止指令重排序。

应用场景:单例,或者在多个线程之间的共享变量,如果有写操作的话,一般需要用volatile修饰

请说明下java的内存模型及其工作流程。

内存模型:java内存模型分为线程自己的栈区和主内存,所以一般线程自己的栈区和主内存会进行定期同步,这种情况下可能会造成数据延迟

为什么代码会重排序?

因为编译器和cpu可能会进行希望对执行时间进行优化
查看评论

[Java] Scanner(System.in) 从控制台输入

import java.util.*; public class ScannerTest{     public static void main(String[] args){ ...
  • shylx123
  • shylx123
  • 2011-04-16 14:51:00
  • 1089

关于Java的线程问题总结

不管你是新程序员还是老手,你一定在面试中遇到过有关线程的问题。Java语言一个重要的特点就是内置了对并发的支持,让Java大受企业和程序员的欢迎。大多数待遇丰厚的Java开发职位都要求开发者精通多线程...
  • g552092947
  • g552092947
  • 2016-08-12 22:25:31
  • 1343

操作系统的课件 关于操作系统的一些问题

  • 2010年06月18日 14:28
  • 2.38MB
  • 下载

小程序的一些问题

  • u012885438
  • u012885438
  • 2017-07-18 16:47:59
  • 77

关于数据库的一些问题(一)

1、查询性能优化 深入理解MySql如何执行查询点击打开链接2、mysql数据库中find_in_set()和in()用法区别点击打开链接3、配置phpmyadmin连接远程 MySQL数据库点击打开...
  • wc_jkyh
  • wc_jkyh
  • 2018-02-28 14:31:33
  • 37

深入java虚拟机——多线程

《深入java虚拟机》中讲述多线程这一块,有如下描述:      “在JVM中,每个对象和类在逻辑上都是和一个监视器相关联的”         “为了实现监视器的排他性监视能力,JVM为每一个对象...
  • zhanglingkang
  • zhanglingkang
  • 2013-04-09 09:58:09
  • 787

guava的坑

Maps.uniqueIndex(values, keyFunction)
  • lynn349x
  • lynn349x
  • 2017-02-21 14:48:15
  • 344

关于设计成本核算的几个问题

目前以月平均价来核算来举例。一、在同一个会计期间里1、先销售后进仓,是负库存的,比如:日期      摘要       数量      单价          成本单价       结存数量09-01...
  • fstao
  • fstao
  • 2009-01-10 11:56:00
  • 2330

java中关于线程的常见面试题

1、什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程...
  • BAO452567228
  • BAO452567228
  • 2016-12-25 13:26:45
  • 474
    个人资料
    等级:
    访问量: 373
    积分: 71
    排名: 167万+
    文章存档
    最新评论