JAVA - 多线程 - 面试题

JAVA - 线程 - 面试题

  1. 下面程序的运行结果()(选择一项)

    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");
    }
    

    在这里插入图片描述

  2. 下列哪个方法可用于创建一个可运行的类()
    在这里插入图片描述

  3. 下列哪个方法可用于创建一个可运行的类()在这里插入图片描述

  4. 在Java多线程中,请用下面哪种方式不会使线程进入阻塞状态()在这里插入图片描述

  5. 以下锁机机制中,不能保证线程安全的是()在这里插入图片描述

  6. 关于sleep()和wait(),以下描述错误的一项是()在这里插入图片描述

  7. 下面所述步骤中,是创建进程做必须的步骤是()在这里插入图片描述

  8. 说说乐观锁与悲观锁

    悲观锁(Pessimistic Lock), 顾名思义,就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。

    乐观锁(Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库如果提供类似于write_condition机制的其实都是提供的乐观锁。

  9. 请写出多线程代码使用Thread或者Runnable,并说出两种的区别。

    方式1:继承Java.lang.Thread类,并覆盖run() 方法。优势:编写简单;劣势:无法继承其它父类

    方式2:实现Java.lang.Runnable接口,并实现run()方法。优势:可继承其它类,多线程可共享同一个Thread对象

  10. 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()方法恢复)

  11. volatile关键字是否能保证线程安全?

    不能。虽然volatile提供了同步的机制,但是知识一种弱的同步机制,如需要强线程安全,还需要使用synchronized。

  12. 进程和线程的区别是什么?

    进程是在执行的应用程序 , 是系统进行资源分配和调度的一个独立单位.
    而线程是进程的内部的一个执行序列 , ,是CPU调度和分派的基本单位 , 共享进程的资源
    一个进程可以有多个线程

  13. Java线程中,sleep()和wait()区别

    sleep是线程类(Thread)的方法;作用是导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复;调用sleep()不会释放对象锁。
    wait是Object类的方法;对此对象调用wait方法导致本线程放弃对象锁,进入等 待此对象的等待锁定池。只有针对此对象发出notify方法(或notifyAll)后本线程才进入对象锁定池,准备获得对象锁进行运行状态。

  14. 请说出与线程同步相关的方法。

    1, 使用synchronized关键字 同步块 同步方法
    2, wait和notify
    3, 使用特殊域变量volatile实现线程同步 (弱同步)
    4, 重入锁 lock 和 unlock

    class 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();
    		}
    		
    	}
    
  15. synchronized关键字的用法?

    synchronized关键字可以将对象或者方法标记为同步,以实现对对象和方法的互斥访问

  16. 未完待续…

  17. 各位同仁如有补充,请留言…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值