java 代码块,static,synchronized,内部类等问题
2012-10-15 11:52
127 查看
迅雷的笔试题,最后的一道30分的判断题,是代码块,static,synchronized,内部类的一道综合题。
一。代码块
1.普通代码块
2.构造代码块 优先于构造方法执行
3.静态代码块 优先于main函数,构造方法执行,且只执行一次
4.同步代码块
二。static
1.静态方法,静态变量都属于类。
2.调用都是通过类名引用。
3.静态方法不能使用非静态变量或方法。反之可以。
4.静态变量在内存中只有一份拷贝。
5.一种static特殊情况,内部静态类。 详见内部类。
三。内部类
一般情况:
1.内部类中隐含有外部类的引用。所以可以使用外部类中所有的东西。
2.创建内部类对象时,必须与外围类对象相关联,创建外围类对象之前,不可能创建内部类的对象。
特殊情况:静态内部类(也称嵌套类)
1.创建静态内部类是不需要外部类。
2.静态内部类不能访问外部类的非静态成员。
四。synchronized
定义:它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
1) public Synchronized void method1 : 锁住的是该对象,类的其中一个实例 , 当该对象(仅仅是这一个对象)在不同线程中执行这个同步方法时,线程之间会形成互斥.达到同步效果,但如果不同线程同时对该类的不同对象执行这个同步方法时,则线程之间不会形成互斥,因为他们拥有的是不同的锁.
2) Synchronized(this){ //TODO } 同一
3) public Synchronized static void method3 : 锁住的是该类,当所有该类的对象(多个对象)在不同线程中调用这个static 同步方法时,线程之间会形成互斥,达到同步效果 , 但如果多个线程同时调用method1 , method3,则不会引互斥,具体讲看最后讲解.
4) Synchronized(Test.class){ //TODO} 同三
5) synchronized(o) {} 这里面的o可以是一个任何Object对象或数组,并不一定是它本身对象或者类,谁拥有o这个锁,谁就能够操作该块程序代码.
这里面1) 与2) 是线程安全的,但1)与3) , 2)与3) 他们所拥有的锁不一样,故不是同步的,不是线程安全的.
补充一道代码块,static 综合的题目
结果:
[align=left]in the static block of calss Count v1.c=0 v2.c=0[/align]
[align=left]in the static block of calss Count v1.c=27 v2.c=27[/align]
[align=left]in the static block of calss Count v1.c=15 v2.c=15[/align]
[align=left]in the main:[/align]
[align=left]ct.c=10[/align]
[align=left]v1.c=10 v2.c=10[/align]
[align=left]v1.c=11 v2.c=11[/align]
ct.c=11
一。代码块
1.普通代码块
2.构造代码块 优先于构造方法执行
3.静态代码块 优先于main函数,构造方法执行,且只执行一次
4.同步代码块
二。static
1.静态方法,静态变量都属于类。
2.调用都是通过类名引用。
3.静态方法不能使用非静态变量或方法。反之可以。
4.静态变量在内存中只有一份拷贝。
5.一种static特殊情况,内部静态类。 详见内部类。
三。内部类
一般情况:
1.内部类中隐含有外部类的引用。所以可以使用外部类中所有的东西。
2.创建内部类对象时,必须与外围类对象相关联,创建外围类对象之前,不可能创建内部类的对象。
特殊情况:静态内部类(也称嵌套类)
1.创建静态内部类是不需要外部类。
2.静态内部类不能访问外部类的非静态成员。
四。synchronized
定义:它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。
1) public Synchronized void method1 : 锁住的是该对象,类的其中一个实例 , 当该对象(仅仅是这一个对象)在不同线程中执行这个同步方法时,线程之间会形成互斥.达到同步效果,但如果不同线程同时对该类的不同对象执行这个同步方法时,则线程之间不会形成互斥,因为他们拥有的是不同的锁.
2) Synchronized(this){ //TODO } 同一
3) public Synchronized static void method3 : 锁住的是该类,当所有该类的对象(多个对象)在不同线程中调用这个static 同步方法时,线程之间会形成互斥,达到同步效果 , 但如果多个线程同时调用method1 , method3,则不会引互斥,具体讲看最后讲解.
4) Synchronized(Test.class){ //TODO} 同三
5) synchronized(o) {} 这里面的o可以是一个任何Object对象或数组,并不一定是它本身对象或者类,谁拥有o这个锁,谁就能够操作该块程序代码.
这里面1) 与2) 是线程安全的,但1)与3) , 2)与3) 他们所拥有的锁不一样,故不是同步的,不是线程安全的.
补充一道代码块,static 综合的题目
class Value { static int c = 0; Value() { c = 15; } Value(int i) { c = i; } static void inc() { c++; } } class Count { public static void prt(String s) { System.out.println(s); } Value v = new Value(10); static Value v1, v2; static { prt("in the static block of calss Count v1.c=" + v1.c + " v2.c=" + v2.c); v1 = new Value(27); prt("in the static block of calss Count v1.c=" + v1.c + " v2.c=" + v2.c); v2 = new Value(); prt("in the static block of calss Count v1.c=" + v1.c + " v2.c=" + v2.c); } } public class TStaticBlock { public static void main(String[] args) { Count ct = new Count(); Count.prt("in the main:"); Count.prt("ct.c=" + ct.v.c); Count.prt("v1.c=" + Count.v1.c + " v2.c=" + Count.v2.c); Count.v1.inc(); Count.prt("v1.c=" + Count.v1.c + " v2.c=" + Count.v2.c); Count.prt("ct.c=" + ct.v.c); } }
结果:
[align=left]in the static block of calss Count v1.c=0 v2.c=0[/align]
[align=left]in the static block of calss Count v1.c=27 v2.c=27[/align]
[align=left]in the static block of calss Count v1.c=15 v2.c=15[/align]
[align=left]in the main:[/align]
[align=left]ct.c=10[/align]
[align=left]v1.c=10 v2.c=10[/align]
[align=left]v1.c=11 v2.c=11[/align]
ct.c=11
相关文章推荐
- Java的3个问题:synchronized方法、volatile关键字、及内部类
- java多线程-多线程的安全问题-多线程同步代码块-锁Synchronized
- java_notes_static、final、内部类、代码块
- Java【多线程知识总结(7)】多线程同步问题-关于synchronized代码块和synchronized方法的应用
- Java【多线程知识总结(7)】多线程同步问题-关于synchronized代码块和synchronized方法的应用
- java基础问题----abstract的method是否可同时是static,是否可同时是native,是否可同时是synchronized
- Java____赋值顺序,调用顺序,内部类衍生问题:赋值和构造器、代码块谁先执行?+4种代码块
- 【java面试题】Static Nested Class(嵌套类) 和 Inner Class(内部类)的不同 、final、static
- java中静态代码块的用法 static用法详解
- java中static方法的使用问题
- java非静态实名内部类加载顺序问题
- Java 内部类,多线程中Synchronized与wait,notify的使用
- 关于java内部类加载顺序的问题
- java中静态代码块的用法 static用法详解
- java static 代码块的应用
- java多线程(五)synchronized关键字修饰代码块
- java中匿名内部类的问题
- synchronized与static synchronized 的区别以及synchronized继承问题
- java static代码块
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题