您的位置:网站首页 > Java教程 > 正文

Java基础知识面试参考指南

类别:Java教程 日期:2019-4-26 7:18:44 人气: 来源:

  杨得志炮轰南阳本文为即将参加面试的Java程序员准备了一些面试常见的Java的基础知识,帮你准备好面试的硬实力。

  在多线程程序中,同步修饰符用来控制对临界区代码的访问。其中一种方式是用synchronized关键字来代码的线程安全性。在Java中,synchronized修饰的代码块或方法不会被多个线程并发访问。它强制要求线程在进入一个方法之前获得一个锁,在离开方法时该锁。它了在同一时刻只有一个线程能执行被其修饰的方法。

  如果我们把一个方法或代码块定义为同步的,就意味着在同一个对象中,只会有一个对同步方法的调用。如果在一个线程内部调用了一个同步方法,则其他线程会一直阻塞,直到第一个线程完成方法调用。

  在进入一个对象的同步方法之前,需要申请对该对象上锁,完成方法调用后锁供其他线程申请。同步方法遵循happens-before机制,它了对象状态的改变在其他线程中都是可见的。

  当标记一个代码块为同步时,需要用一个对象作为参数。当一个运行线程执行到该代码块时,要等到其他运行线程退出这个对象的同步代码区。然而,一个线程可以进入另一个对象的同步代码区。但是同一个对象的非同步方法可以不用申请锁。

  如果定义一个静态方法为同步,则是在类上同步,而不是在对象上同步。也即如果一个静态同步方法在执行时,整个类被锁住,对该类中的其他静态方法调用会阻塞。

  2)当一个线程进入了一个类的静态同步方法,则其他任何线程都不能进入该类的任何一个静态同步方法。

  同步的静态方法和非静态方法之间没有关系。也即静态同步方法和非静态同步方法可以同时执行,除非非静态同步方法显式在该类上同步(例如,synchronized(MyClass.class){…})

  每个对象都有一个锁对象,一个线程在访问对象之前必须申请锁,完成以后锁。其他线程不能访问对象,知道获得该对象的锁。这了一个线程改变了对象的状态后,新的状态对其他在同一个器上线程可见。

  当线程锁时,会将cache中的内容更新到主内存,这也就使得该对象的状态变化对其他线程是可见的——这就是happens-before关系。

  如果方法是对象或对象实例,线程将锁住该实例。如果方法是静态的,线程锁住的是该类对应的Class对象。同步方法用SYNCHRONIZED标记,该标记被方法调用指令识别。

  来看语句 int c++,它包含多个操作,e.g. 从内存读取c的值,将c的值加1,然后写回内存。这个操作对单线程来说是正确的,但是在多线程却可能出错。它存在竞态条件,在多线程中可能多个线程同时读取c的值

  Java并发包current.atomic定 义了对单个变量进行原子操作的类。所有类都有get和set方法,就像对volatile变量的读写一样。这就意味着,一个写操作happens- before其他任何对该变量的读操作。原子方法compareAndSet同样有这些特性,就像对整型变量做原子的算术运算一样。

  在Java 5.0的并发包中,定义了支持原子操作的类。Java虚拟机编译这些类时利用硬件提供的CAS(Compare and set)来实现。

  volatile只能用来修饰变量。用volatile修饰的变量可能被异步地修改,所以编译器会对它们特殊处理。

  使用volatile修饰的变量降低了内存一致性的风险,因为任何对volatile变量的写操作都能被其他线程可见。另外,当一个线程访问volatile变量时,不止能看到对该变量最近的修改,还能修改该变量的代码所带来的其他影响。

  在多线程中,对象在不同线程中都保存有副本。但是volatile变量却没有,它们在堆中只有一个实例。这样对volatile变量的修改就能立即对其他线程可见。另外,本地线程缓存没有完成后刷新的工作。

  声明一个静态变量,意味着该类的多个实例将共享该变量,静态变量与类关联而不是与对象关联。线程可能会有静态变量的本地缓存值。

  当两个线程同时更新静态(非volatile)变量的值时,可能有一个线程的缓存中是一个过期的值。虽然多线程能够访问的是同一个静态变量,每个线程还是可能会保存自己的缓存副本。

  在线程内存和主内存之间,volatile只是同步了一个变量的值,synchronized则同步了(synchronized块中)所有变量的值,并且会锁住和一个器。所以,synchronized比volatile会有更多的开销。

  volatile变量不允许有一个本地副本与主内存中的值不同。一个声明为volatile的变量必须所程中的副本同步,不管哪个线程修改了变量的值,另外其他线程都能立即看到该值。

  锁对象的作用像synchronized代码使用的隐式锁一样。像隐式锁一样,同时只能有一个线程持有锁。锁还支持wait/notify机制,通过他们之间的condition对象。

  锁对象相对于隐式锁最大的优点是,他们能从尝试获得锁的状态返回。如果锁当前不可用或者在一个超时时间之前,tryLock()方法能够返回。在获得锁之前,如果其他线程发送了一个中断,lockInterruptibly()方法能返回。

  在 Java中,创建的对象存放在堆中。Java堆被称为内存回收堆。内存收集不能强制执行。当内存收集器运行时,它掉那些不可达对象占用的内存。垃圾收集线程作为一个优先级较低的守护线程运行。你能通过System.gc()提示虚拟机进行垃圾回收,但是不能其执行。

  在多线程中,死锁意味着两个或多个线程一直阻塞,等待其他线程锁。下面是死锁的一个示例:

  垃圾收集器将会在下一次垃圾收集时回收弱引用。弱引用能被用来实现特殊的map。java.util.WeakHashMap中的key就是弱引用。

   文章来源于850游戏博贝棋牌

0
0
0
0
0
0
0
0
下一篇:没有资料

网友评论 ()条 查看

姓名: 验证码: 看不清楚,换一个

推荐文章更多

热门图文更多

最新文章更多

关于联系我们 - 广告服务 - 友情链接 - 网站地图 - 版权声明 - 人才招聘 - 帮助

郑重声明:本站资源来源网络 如果侵犯了你的利益请联系站长删除

CopyRight 2010-2012 技术支持 FXT All Rights Reserved