当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法
- 格式:doc
- 大小:36.50 KB
- 文档页数:4
java选择题100题一、选择1、下面哪些是java语言中的关键字?A.si z eofB abstractC NULLD Native2、下面语句哪个是正确的?A char='abc';B long l=oxfff;C float f=0.23;D double=0.7E-3;3、以下程序测试String 类的各种构造方法,试选出其运行效果。
class STR{public static void main(String args[]){String s1=new String();String s2=new String("String 2");char chars[]={'a',' ','s','t','r','i','n','g'};String s3=new String(chars);String s4=new String(chars,2,6);byte bytes[]={0,1,2,3,4,5,6,7,8,9};StringBuffer sb=new StringBuffer(s3);String s5=new String(sb);System.out.println("The String No.1 is "+s1);System.out.println("The String No.2 is "+s2);System.out.println("The String No.3 is "+s3);System.out.println("The String No.4 is "+s4);System.out.println("The String No.5 is "+s5);}}A The String No.1 isThe String No.2 is String 2The String No.3 is a stringThe String No.4 is stringThe String No.5 is a stringB The String No.1 isThe String No.2 is String 2The String No.3 is a stringThe String No.4 is tringThe String No.5 is a stringC The String No.1 isThe String No.2 is String 2The String No.3 is a stringThe String No.4 is strinThe String No.5 is a stringD 以上都不对4、下面语句段的输出结果是什么?int i = 9;sw itch (i) {default:System.out.println("default"); case 0:System.out.println("zero"); break;case 1:System.out.println("one"); case 2:System.out.println("two"); }A defaultB default, zeroC error default clause not definedD no output displayed二、多项选择1、下面哪些语句能够正确地生成5个空字符串?A String a[]=new String[5]; for(int i=0;i<5;a[++]="");B String a[]={"","","","",""};C String a[5];D String[5]a;E String []a=new String[5]; for( int i=0;i<5;a[i++]=null);2、下面哪些选项将是下述程序的输出?public class Outer{public static void main(String args[]){Outer: for(int i=0; i<3; i++)inner:for(int j=0;j<3;j++){if(j>1) break;System.out.println(j+"and"+i);}}}A 0 and 0B 0 and 1C 0 and 2D 0 and 3E 2 and 2F 2 and 1G 2 and 03、下面哪个语句正确地声明一个整型的二维数组?A int a[][] = new int[][];B int a[10][10] = new int[][];C int a[][] = new int[10][10];D int [][]a = new int[10][10];E int []a[] = new int[10][10];JAVA笔试题选择题1下面哪个是正确的类声明?假设每一段文本都做为一个名称为Fred.java的文件的全部内容?a).public class Fred{public int x = 0;public Fred (int x){this.x=x;}}b).public class fred{public int x = 0;public Fred (int x){this.x=x;}}c).public class Fred extends MyBaseClass, MyOtherBaseClass{ public int x = 0;public Fred(int xval){x=xval;}}d).protected class Fred{private int x = 0;private Fred (int xval){x=xval;}}A. a)B. b)C. c)D. d)2.在类设计中,类的成员变量要求仅仅能够被同一package下的类访问,请问应该使用下列哪个修辞词A. protectedB. publicC. privateD. 不需要任何修辞词3.下面那个是Runable接口的方法?A. runB. startC. yieldD. stop4.给出类框架如下:class Example{private int x;//rest of class body…}假定通过java Example调用x,下列哪个语句能够使得在Example.java的main 方法中直接访问x?A. 声明x为public而不是privateB. 声明x为static而不是privateC. 声明x为protected而不是privateD. 声明x为final而不是private5.给出:以下类public class ReturnIt{ReturnType methodA(byte x,double y){return (short)x/y*2;}}对于在第二行的方法methodA,他的返回值的类型应该是A. intB. byteC. longD. shortE. floatF. double6.下面列出的那个是java的保留字?A. ifB. gotoC. whileD. caseE. then7.十进制变量i的值为12,那么八进制的变量i的值为:A. O08B. O10C. O12D. O14E. O168.下列哪些说法是正确的?A. 在collection类树上,最顶层的类叫做CollectionB. collection接口有个方法是enumeratorC. interator方法返回一个Vetor类的实例D. set接口是为了那些不重复的元素设计的9.现有下列代码片断:switch(x){case 1: System.out.println("Test 1");break; case 2:case 3: System.out.println("Test 2");break; default: System.out.println("end");}X为何值时将输出"T est2"A. 1或2B. 1或2或3C. 2或3D. 3E. default10.public class Test{public int aMethod(){static int i=0;i++;return i;}public static void main(String args[]){ Test test = new Test();test.aMethod();int j=test.aMethod();System.out.println(j);}}结果是什么?A. 编译失败B. 编译成功和程序打出"0"C. 编译成功和程序打出"1"D. 编译成功和程序打出"2"11. 选择有效的java命名A. userNameB. %passwdC. 3d_gameD. $chargeE. this12. 变量 "result" 是 boolean类型,下列那些表达式是合法的A. result = true;B. if ( result ) { // do something... }C. if ( result!= 0 ) { // so something... }D. result = 113。
线程练习题答:有两种实现方法,分别是继承Thread类与实现Runnable接口用synchronized关键字修饰同步方法反对使用stop,是因为它不安全。
它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。
结果很难检查出真正的问题所在。
suspend方法容易发生死锁。
调用suspend 的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。
此时,其他任何线程都不能访问锁定的资源,除非被”挂起”的线程恢复运行。
对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。
所以不应该使用suspend,而应在自己的Thread类中置入一个标志,指出线程应该活动还是挂起。
若标志指出线程应该挂起,便用wait命其进入等待状态。
若标志指出线程应当恢复,则用一个notify重新启动线程。
2、sleep 和 wait 有什么区别?答:sleep是线程类的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。
调用sleep不会释放对象锁。
wait是Object类的方法,对此对象调用wait方法导致本线程放弃对象锁,进入等待此对象的等待锁定池,只有针对此对象发出notify方法后本线程才进入对象锁定池准备获得对象锁进入运行状态。
3、同步和异步有何异同,在什么情况下分别使用他们?举例说明。
答:如果数据将在线程间共享。
例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。
当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望让程序等待方法的返回时,就应该使用异步编程,在很多情况下采用异步途径往往更有效率。
4、启动一个线程是用run还是start?答:启动一个线程是调用start方法,使线程所代表的虚拟处理机处于可运行状态,这意味着它可以由JVM调度并执行。
一. Java基础部分面试题1、一个".java"源文件中是否可以包括多个类(不是内部类)?有什么限制?答:可以包括但公共类只能有一个、且与源文件名相同2、Java有没有goto?答:有、但是是作为保留字存在的。
3、说说&和&&的区别。
答:在java中,这两个符号都属于逻辑运算符与的操作。
但&&表示的是短路运算,所谓的短路运算是,与运算中,两边的表达式的布尔值,如果有一个为假,另外一个就不需要进行判断了。
最为常见的地方是,if(o!=null&&o.equals(s)) 如果第一个为false 那么不会对第二个式子判断,但如果是非短路运算符& 会对第二个判断,但此时o为空,会抛出NullPointerExcetption异常而&还有取地址的作用常用来对一个整数的后四bit位计算(常和ox0f进行运算)。
4、在JAVA中如何跳出当前的多重嵌套循环?答:关键字常见的有return、ok标号和break。
用法上:ok是使用带有ok标号的break 语句我最常用的不是这一种,而是return和让外层的循环条件表达式的结果可以受到内层循环代码的控制。
5、switch语句能否作用在byte上,能否作用在long上,能否作用在String上?答:可以作用在byte、short、int、char(及以上四种的包装类)7.0之后支持String 和枚举.可以理解为 expression值只能是整型表达式和枚举常量6、short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?答:错误在于s1+1是一个短整型和一个1相加 1作为字面值是byte、short、int通用的,但在进行刚才的加法运算时,会被认为是一个整型。
整型和短整型相加会出现自动类型提升。
将提升后的整型值赋值给一个短整型会报错而直接给short赋值一个1不会被认为是整型,只有在加法运算时会。
synchronized原理
一、synchronized关键字
synchronized是Java中的一个关键字,它是用来保证多线程同步访问共享资源的
一种机制。
它能够保证同一时间只有一个线程可以执行某段代码,从而避免了多线程访问共享资源导致的数据不一致性问题。
二、synchronized原理
1. 基本原理
synchronized锁定的是一个对象,当一个线程获取了锁后,其他线程就不能再访
问这段代码,直到当前线程释放锁,其他线程才能申请到锁,执行这段代码。
2. 内存可见性
synchronized锁定的对象会引起其他线程对它的更新的可见性,也就是内存可见性。
其实,也是因为synchronized的内存可见性,才能保证修改操作的原子性、
同步性,因此能够保证多线程同步访问共享资源的安全性。
当一个线程调用synchronized方法或者改成synchronized关键词修饰的代码
块时,发生如下动作:
(1)线程获得指定对象的对象锁;
(2)线程从主内存拷贝锁对象的副本到它的工作内存;
(3)线程执行同步代码;
(4)线程将局部变量同步回主内存;
(5)线程释放指定对象的对象锁。
三、总结
synchronized是Java中一个比较常用的关键字,它能使线程安全的访问共享资源,它的基本原理是:当一个线程调用了synchronized方法或代码块时,它就获得了
指定对象的对象锁,同时也会造成内存可见性,从而达到保证修改操作的原子性、同步性的目的。
精选Java笔试题目在JAVA中,往往都会有面试题的。
下面YJBYS小编为大家精心搜集了关于精选Java题目,欢迎大家参考借鉴,希望可以帮助到大家!1、面向对象的特征有哪些方面1.抽象2.继承3.封装4.多态性2、String是最基本的数据类型吗?基本数据类型包括byte、int、char、long、float、double、boolean和short。
ng.String类是final类型的,因此不可以继承这个类、不能修改这个类。
为了提高效率节省空间,我们应该用StringBuffer 类3、int 和Integer 有什么区别?Java提供两种不同的类型:引用类型和原始类型(或内置类型)。
Int是java的原始数据类型,Integer是java为int提供的封装类。
Java为每个原始类型提供了封装类。
原始类型封装类boolean Booleanchar Characterbyte Byteshort Shortint Integerlong Longfloat Floatdouble Double引用类型和原始类型的行为完全不同,并且它们具有不同的语义。
引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。
对象引用实例变量的缺省值为null,而原始类型实例变量的缺省值与它们的类型有关。
4、String 和StringBuffer的区别JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。
这个String类提供了数值不可改变的字符串。
而这个StringBuffer类提供的字符串进行修改。
当你知道字符数据要改变的时候你就可以使用StringBuffer。
典型地,你可以使用StringBuffers来动态构造字符数据。
5、运行时异常与一般异常有何异同?异常表示程序运行过程中可能出现的非正常状态,运行时异常表示虚拟机的通常操作中可能遇到的异常,是一种常见运行错误。
Java面试题以及答案1.J2EE是什么?答:Je22是Sun公司提出的多层(multi-diered),分布式(distributed),基于组件(component-base)的企业级应用模型(enterpriese application model).在这样的一个应用系统中,可按照功能划分为不同的组件,这些组件又可在不同计算机上,并且处于相应的层次(tier)中。
所属层次包括客户层(clietn tier)组件,web层和组件,Business 层和组件,企业信息系统(EIS)层。
2.J2EE是技术还是平台还是框架?答:J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。
J2EE也是一个框架,包括JDBC、JNDI、RMI、JMS、EJB、JTA等技术。
3.MVC的各个部分都有那些技术来实现?如何实现?答:MVC是Model-View-Controller的简写。
"Model" 代表的是应用的业务逻辑(通过JavaBean,EJB 组件实现),"V iew" 是应用的表示面(由JSP页面产生),"Controller" 是提供应用的处理过程控制(一般是一个Servlet),通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现。
这些组件可以进行交互和重用。
6.C/S 与B/S 区别:答:有如下八个方面的不同:(1)硬件环境不同: (2)对安全要求不同(3)对程序架构不同(4)软件重用不同(5)系统维护不同(6)处理问题不同(7)用户接口不同(8)信息流不同7.什么是JNDI答:(Java Naming & Directory Interface)JA V A命名目录服务。
主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。
8.什么是JMS答:(Java Message Service)JA V A消息服务。
synchronized锁方法
Java中的synchronized锁方法是一种保证线程安全的方法。
当一个线程进入synchronized锁方法时,该方法会被锁定,其他线程必须等待该方法执行完毕才能进入。
这样可以避免多个线程同时访问共享资源造成数据不一致的问题。
synchronized锁方法可以用在实例方法和静态方法上。
对于实例方法,锁定的是当前实例对象(即this);对于静态方法,锁定的是当前类的Class对象。
在使用synchronized锁方法时,需要注意以下几点:
1. 锁定的是当前对象或类,而非方法名或代码块。
2. synchronized锁方法只能保证同一个实例对象或同一个类的线程安全。
如果不同实例对象或不同类的线程同时访问,仍然可能会出现线程安全问题。
3. synchronized锁方法会影响程序的执行效率。
因为每次只能有一个线程进入锁定的方法,其他线程必须等待,所以会增加程序的执行时间。
因此,在使用synchronized锁方法时,需要根据具体情况进行权衡,选择合适的同步方式。
- 1 -。
synchronized作用范围和用法synchronized是Java的关键字之一,用于实现多线程的同步控制。
它的作用是控制多线程对同一个共享资源的访问,以避免多线程并发操作导致的数据不一致或冲突问题。
synchronized可以应用于方法、代码块和静态方法,下面将详细讨论这些用法。
1. 方法级别的synchronized:在方法的声明中使用synchronized关键字可以实现对整个方法的同步控制。
当一个线程进入一个带有synchronized关键字的方法时,它会自动获得这个方法的锁,其他线程将被阻塞,直到该线程执行完方法并释放锁。
该方法在整个执行期间只能被一个线程访问,从而确保了线程安全。
2. 代码块级别的synchronized:除了整个方法级别,还可以在方法中使用synchronized关键字来限制某些代码块的访问。
使用synchronized代码块时,必须指定一个对象作为该代码块的锁。
当线程进入代码块时,它会尝试获得锁,如果锁被其他线程占用,则该线程将被阻塞,直到锁被释放。
可以使用任意非null的对象作为锁,只要不同的线程都能够访问到同一个锁对象。
3. 静态方法级别的synchronized:除了在实例方法级别上进行同步控制,synchronized还可以用于静态方法上。
使用synchronized关键字修饰的静态方法会对该静态方法所属的类对象进行加锁,即类锁。
与实例方法不同的是,类锁的作用范围是整个类,而不是该类的对象。
因此,即使多个线程访问不同的实例方法,如果这些方法都属于同一个类,它们也会相互阻塞。
synchronized的使用可以避免多线程环境下的数据竞争和不一致性,保证线程安全。
它可以控制对共享资源的访问、修改和更新,确保一次只有一个线程能够对共享资源进行操作,从而避免了互斥和并发访问导致的数据错误。
synchronized还具有可见性,当一个线程释放锁时,它会将最新的数据刷新到主内存,从而保证其他线程能够看到最新的数据。
一.单选题二.多选题三.简答题四.查错题五.编程题六.数据库一.单选题1.下列不可作为java语言修饰符的是(D)A) a1 B) $1C) _1 D) 112.有一段java 应用程序,它的主类名是a1,那么保存它的源文件名可以是(A)A) a1.java B) a1.classC) a1 D) 都对3.整型数据类型中,需要内存空间最少的是(D)A) short B) longC) int D) byte4. Java 类可以作为(C)A) 类型定义机制 B) 数据封装机制C) 类型定义机制和数据封装机制 D) 上述都不对5.在创建对象时必须(C)A) 先声明对象,然后才能使用对象B) 先声明对象,为对象分配内存空间,然后才能使用对象C) 先声明对象,为对象分配内存空间,对对象初始化,然后才能使用对象D) 上述说法都对6.在调用方法时,若要使方法改变实参的值,可以(B)A) 用基本数据类型作为参数B) 用对象作为参数C) A和B都对D) A和B都不对7. Java中(C)A) 一个子类可以有多个父类,一个父类也可以有多个子类B) 一个子类可以有多个父类,但一个父类只可以有一个子类C) 一个子类可以有一个父类,但一个父类可以有多个子类D) 上述说法都不对8.Java语言具有许多优点和特点,哪个反映了Java程序并行机制的特点?(B)A) 安全性 B) 多线性C) 跨平台 D) 可移植9. Character流与Byte流的区别是(C)A) 每次读入的字节数不同B) 前者带有缓冲,后者没有C) 前者是字符读写,后者是字节读写D) 二者没有区别,可以互换使用10.以下声明合法的是(D)A)default String s; B)public final static native int w( ) C)abstract double d; D)abstract final double hyperbolicCosine( )11.关于以下application的说明,正确的是(C)2. {3. static int x=10;4. static { x+=5;}5. public static void main(String args[ ])6. {7. System.out.println(“x=” + x); 8. }9. static { x/=3;}10. }A)4行与9行不能通过编译,因为缺少方法名和返回类型B)9行不能通过编译,因为只能有一个静态初始化器C)编译通过,执行结果为:x=5D)编译通过,执行结果为:x=312.关于以下程序代码的说明正确的是(D)1.class HasStatic{2. private static int x=100;3. public static void main(String args[ ]){4. HasStatic hs1=new HasStatic( );5. hs1.x++;6. HasStatic hs2=new HasStatic( );7. hs2.x++;8. hs1=new HasStatic( );9. hs1.x++;11. System.out.println(“x=”+x);12. }13. }A) 5行不能通过编译,因为引用了私有静态变量B) 10行不能通过编译,因为x是私有静态变量C) 程序通过编译,输出结果为:x=103D) 程序通过编译,输出结果为:x=10213.以下选项中循环结构合法的是(C)A)while (int i<7){i++;System.out.println(“i is “+i);}B) int j=3;while(j) {System.out.println(“ j is “+j);}C)int j=0;for(int k=0; j + k !=10; j++,k++) {System.out.println(“ j is “+ j + “k is”+ k);}D) int j=0;do{System.out.println( “j is “+j++);if (j = = 3) {continue loop;}}while (j<10);14. 类Test1定义如下:1.public class Test1{2. public float aMethod(float a,float B){ } 3.4.}将以下哪种方法插入行3是不合法的。
当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法?(2nd)
日前在网上见到一道Java笔试试题,如题所述。
给出的答案如下:
答:不能,一个对象的一个synchronized方法只能由一个线程访问。
本人认为有些所答非所问。
故写了两个demo进行测试。
发现答案要分三种情况讨论。
情况一:
当一个线程进入一个对象的一个synchronized方法后,其它线程访问该对象的非同步方法。
代码如下:
package com.mutithreading.Object;
public class InvokedObject
{
public synchronized void synchronizedMethod()
{
System.out.println("Invoked synchronizedMethod !") ;
try{
Thread.sleep(10000) ;
} catch(InterruptedException e) {
e.printStackTrace();
}
}
public void generalMethod()
{
System.out.println("Invoked generalMethod ...") ;
}
}
package com.mutithreading.threads;
import com.mutithreading.Object.InvokedObject; public class ThreadOne implements Runnable { private InvokedObject object;
public ThreadOne(InvokedObject object)
{
this.object= object ;
}
public void run() {
object.synchronizedMethod() ;
}
}
package com.mutithreading.threads;
import com.mutithreading.Object.InvokedObject; public class ThreadTwo implements Runnable { private InvokedObject object;
public ThreadTwo(InvokedObject object)
{
this.object= object ;
}
public void run() {
// TODO Auto-generated method stub
object.generalMethod() ;
}
}
package com.mutithreading.client;
import com.mutithreading.Object.InvokedObject; import com.mutithreading.threads.ThreadOne; import com.mutithreading.threads.ThreadTwo;
public class Client {
/**
* @param args
*/
public static void main(String[] args) {
InvokedObject object = new InvokedObject() ;
ThreadOne one = new ThreadOne(object) ;
ThreadTwo two = new ThreadTwo(object) ;
Thread threadOne = new Thread(one) ;
Thread threadTwo = new Thread(two) ;
threadOne.start() ;
threadTwo.start() ;
}
}
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程可以同时访问这个对象的非同步方法。
情况二:
当一个线程进入一个对象的一个synchronized方法后,其它线程也访问该同步方法。
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个同步方法。
(代码略)
情况三:
当一个线程进入一个对象的一个synchronized方法后,其它线程同时访问该对象的另一个同步方法。
此处仅给出对InvokedObject类做出的修改代码:
package com.mutithreading.Object;
public class InvokedObject
{
public synchronized void synchronizedMethod1()
{
System.out.println("Invoked synchronizedMethod1 !") ;
try{
Thread.sleep(10000) ;
} catch(InterruptedException e) {
e.printStackTrace();
}
}
public synchronized void synchronizedMethod2()
{
System.out.println("Invoked synchronizedMethod2 !") ;
}
}
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。