JAVA - 线程 - 面试题
-
下面程序的运行结果()(选择一项)
public static void main(String[] args) { Thread t=new Thread(){ public void run(){ pong(); } }; t.run(); System.out.println("ping"); } static void pong(){ System.out.println("pong"); }
-
下列哪个方法可用于创建一个可运行的类()
-
下列哪个方法可用于创建一个可运行的类()
-
在Java多线程中,请用下面哪种方式不会使线程进入阻塞状态()
-
以下锁机机制中,不能保证线程安全的是()
-
关于sleep()和wait(),以下描述错误的一项是()
-
下面所述步骤中,是创建进程做必须的步骤是()
-
说说乐观锁与悲观锁
悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。
-
请写出多线程代码使用Thread或者Runnable,并说出两种的区别。
方式1:继承Java.lang.Thread类,并覆盖run() 方法。优势:编写简单;劣势:无法继承其它父类
方式2:实现Java.lang.Runnable接口,并实现run()方法。优势:可继承其它类,多线程可共享同一个Thread对象
-
Java线程的几种状态 ?
线程是一个动态执行的过程,它有一个从产生到死亡的过程,共五种状态:
1 , 新建(new Thread)
当创建Thread类的一个实例(对象)时,此线程进入新建状态(未被启动)
例如:Thread t1=new Thread();2 , 就绪(runnable)
线程已经被启动,正在等待被分配给CPU时间片,也就是说此时线程正在就绪队列中排队等候得到CPU资源。例如:t1.start();3 , 运行(running)
线程获得CPU资源正在执行任务(run()方法),此时除非此线程自动放弃CPU资源或者有优先级更高的线程进入,线程将一直运行到结束。4 , 死亡(dead)
当线程执行完毕或被其它线程杀死,线程就进入死亡状态,这时线程不可能再进入就绪状态等待执行。
自然终止:正常运行run()方法后终止
异常终止:调用stop()方法让一个线程终止运行5 , 堵塞(blocked)
由于某种原因导致正在运行的线程让出CPU并暂停自己的执行,即进入堵塞状态。
正在睡眠:用sleep(long t) 方法可使线程进入睡眠方式。一个睡眠着的线程在指定的时间过去可进入就绪状态。
正在等待:调用wait()方法。(调用motify()方法回到就绪状态)
被另一个线程所阻塞:调用suspend()方法。(调用resume()方法恢复) -
volatile关键字是否能保证线程安全?
不能。虽然volatile提供了同步的机制,但是知识一种弱的同步机制,如需要强线程安全,还需要使用synchronized。
-
进程和线程的区别是什么?
进程是在执行的应用程序 , 是系统进行资源分配和调度的一个独立单位.
而线程是进程的内部的一个执行序列 , ,是CPU调度和分派的基本单位 , 共享进程的资源
一个进程可以有多个线程 -
Java线程中,sleep()和wait()区别
sleep是线程类(Thread)的方法;作用是导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复;调用sleep()不会释放对象锁。
wait是Object类的方法;对此对象调用wait方法导致本线程放弃对象锁,进入等 待此对象的等待锁定池。只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池,准备获得对象锁进行运行状态。 -
请说出与线程同步相关的方法。
1, 使用synchronized关键字 同步块 同步方法
2, wait和notify
3, 使用特殊域变量volatile实现线程同步 (弱同步)
4, 重入锁 lock 和 unlockclass Bank { //需要同步的变量加上volatile private volatile int account = 100; public int getAccount() { return account; } //这里不再需要synchronized public void save(int money) { account += money; } }
private int account = 100; private ReentrantLock lock = new ReentrantLock(); public int getAccount() { return account; } //同步方法 public void save(int money) { lock.lock(); try { account+=money; } finally { lock.unlock(); } }
-
synchronized关键字的用法?
synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问
-
未完待续…
-
各位同仁如有补充,请留言…