当一个线程进入一个对象的一个synchronized方法后,其它线程是否可进入此对象的其它方法

合集下载

java选择题100题

java选择题100题

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调度并执行。

corejava部分面试题

corejava部分面试题

一. 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原理
一、synchronized关键字
synchronized是Java中的一个关键字,它是用来保证多线程同步访问共享资源的
一种机制。

它能够保证同一时间只有一个线程可以执行某段代码,从而避免了多线程访问共享资源导致的数据不一致性问题。

二、synchronized原理
1. 基本原理
synchronized锁定的是一个对象,当一个线程获取了锁后,其他线程就不能再访
问这段代码,直到当前线程释放锁,其他线程才能申请到锁,执行这段代码。

2. 内存可见性
synchronized锁定的对象会引起其他线程对它的更新的可见性,也就是内存可见性。

其实,也是因为synchronized的内存可见性,才能保证修改操作的原子性、
同步性,因此能够保证多线程同步访问共享资源的安全性。

当一个线程调用synchronized方法或者改成synchronized关键词修饰的代码
块时,发生如下动作:
(1)线程获得指定对象的对象锁;
(2)线程从主内存拷贝锁对象的副本到它的工作内存;
(3)线程执行同步代码;
(4)线程将局部变量同步回主内存;
(5)线程释放指定对象的对象锁。

三、总结
synchronized是Java中一个比较常用的关键字,它能使线程安全的访问共享资源,它的基本原理是:当一个线程调用了synchronized方法或代码块时,它就获得了
指定对象的对象锁,同时也会造成内存可见性,从而达到保证修改操作的原子性、同步性的目的。

精选Java笔试题目

精选Java笔试题目

精选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笔试题以及答案

Java笔试题以及答案

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锁方法

synchronized锁方法

synchronized锁方法
Java中的synchronized锁方法是一种保证线程安全的方法。

当一个线程进入synchronized锁方法时,该方法会被锁定,其他线程必须等待该方法执行完毕才能进入。

这样可以避免多个线程同时访问共享资源造成数据不一致的问题。

synchronized锁方法可以用在实例方法和静态方法上。

对于实例方法,锁定的是当前实例对象(即this);对于静态方法,锁定的是当前类的Class对象。

在使用synchronized锁方法时,需要注意以下几点:
1. 锁定的是当前对象或类,而非方法名或代码块。

2. synchronized锁方法只能保证同一个实例对象或同一个类的线程安全。

如果不同实例对象或不同类的线程同时访问,仍然可能会出现线程安全问题。

3. synchronized锁方法会影响程序的执行效率。

因为每次只能有一个线程进入锁定的方法,其他线程必须等待,所以会增加程序的执行时间。

因此,在使用synchronized锁方法时,需要根据具体情况进行权衡,选择合适的同步方式。

- 1 -。

synchronized作用范围和用法

synchronized作用范围和用法

synchronized作用范围和用法synchronized是Java的关键字之一,用于实现多线程的同步控制。

它的作用是控制多线程对同一个共享资源的访问,以避免多线程并发操作导致的数据不一致或冲突问题。

synchronized可以应用于方法、代码块和静态方法,下面将详细讨论这些用法。

1. 方法级别的synchronized:在方法的声明中使用synchronized关键字可以实现对整个方法的同步控制。

当一个线程进入一个带有synchronized关键字的方法时,它会自动获得这个方法的锁,其他线程将被阻塞,直到该线程执行完方法并释放锁。

该方法在整个执行期间只能被一个线程访问,从而确保了线程安全。

2. 代码块级别的synchronized:除了整个方法级别,还可以在方法中使用synchronized关键字来限制某些代码块的访问。

使用synchronized代码块时,必须指定一个对象作为该代码块的锁。

当线程进入代码块时,它会尝试获得锁,如果锁被其他线程占用,则该线程将被阻塞,直到锁被释放。

可以使用任意非null的对象作为锁,只要不同的线程都能够访问到同一个锁对象。

3. 静态方法级别的synchronized:除了在实例方法级别上进行同步控制,synchronized还可以用于静态方法上。

使用synchronized关键字修饰的静态方法会对该静态方法所属的类对象进行加锁,即类锁。

与实例方法不同的是,类锁的作用范围是整个类,而不是该类的对象。

因此,即使多个线程访问不同的实例方法,如果这些方法都属于同一个类,它们也会相互阻塞。

synchronized的使用可以避免多线程环境下的数据竞争和不一致性,保证线程安全。

它可以控制对共享资源的访问、修改和更新,确保一次只有一个线程能够对共享资源进行操作,从而避免了互斥和并发访问导致的数据错误。

synchronized还具有可见性,当一个线程释放锁时,它会将最新的数据刷新到主内存,从而保证其他线程能够看到最新的数据。

java笔试面试题

java笔试面试题

一.单选题二.多选题三.简答题四.查错题五.编程题六.数据库一.单选题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是不合法的。

JAVA面试经典试题及答案1

JAVA面试经典试题及答案1
Runtime.getRuntime().gc();能增加 GC 启动的优先级,但是不保证一定执行。
9. String s = new String("xyz"); 创建了几个 String Object. 2个
10. Math.round(11.5)等于多少?Math.round(-11.5)等于多少?
24. 启动一个线程使用 run() 还是 start() ? 启动线程是用 start()方法
25. 构造器 Constructor 是否可以被 override? 构造器不可以被 override
26. 是否可以继承 String 类? 不可以
27. 当一个线程进入一个对象的 synchronized 方法后, 其他线程是否可以进入此对象的其 他方法? 当 线 程 进 入 一 个 对 象 的 synchronize 方 法 后 , 其 他 线 程 可 以 访 问 这 个 对 象 的 非
36. 什么是 Web Service? Web Service 就是为了是原来孤立的站点之间的信息能够相互通讯、共享而提出的一种
接口
37. 多线程有几种实现方法?都是什么?同步有几种实现方法? 多线程有两种实现方法:分别是实现 Thread 类和 Runnable 接口 同步有两种实现方法:分别是 synchronized, wait 和 notify
30. 两个对象值相同(x.equals(y) = = true), 但却有不同的 hashCode, 这句话对不对? 不对,equal 方法必须和 hashCode 方法保持一致,如果实现者没有做到这一点,编译器
也不会报错,但这是一个严重的隐患
31. 当以对象被当做参数传递一个方法后, 此方法可改变这个对象的属性, 并可返回变化的 结果, 那么这里到底是值传递还是引用传递?

synchronized使用方式

synchronized使用方式

synchronized使用方式在Java多线程编程中,synchronized关键字是一种非常重要的同步机制。

它可以用来保证多个线程之间的操作是有序的,避免出现竞态条件等问题。

本文将详细介绍synchronized的使用方式,包括synchronized方法、synchronized块和synchronized静态方法等。

一、synchronized方法synchronized方法是指在方法声明中添加synchronized关键字,使得该方法在执行时具有互斥性。

当一个线程进入synchronized方法时,其他线程将被阻塞,直到当前线程执行完该方法后才能继续执行。

synchronized方法的使用非常简单,只需要在方法声明前面添加synchronized关键字即可。

例如,下面的代码演示了synchronized方法的使用:```public synchronized void doSomething() {// 一些操作}```在上面的代码中,doSomething()方法被声明为synchronized 方法。

当一个线程进入该方法时,其他线程将被阻塞,直到当前线程执行完该方法后才能继续执行。

这样就可以保证doSomething()方法的操作是有序的,避免出现竞态条件等问题。

需要注意的是,synchronized方法只能作用于对象实例,而不能作用于静态方法和类。

如果需要同步静态方法或类,需要使用synchronized静态方法或synchronized块。

二、synchronized块synchronized块是指在代码块中添加synchronized关键字,使得该代码块在执行时具有互斥性。

当一个线程进入synchronized 块时,其他线程将被阻塞,直到当前线程执行完该代码块后才能继续执行。

synchronized块的使用方式如下:```public void doSomething() {synchronized (this) {// 一些操作}}```在上面的代码中,synchronized块使用了this作为锁对象。

java多线程试题

java多线程试题

狂翔IT工作室多线程试程一.选择题1.下列说法中,正确的一项是() AA.单处理机的计算机上,2个纯种一官半职直不能并发执行B.单处理机的计算机上,2个线程实际能够并发执行C.一个线程可以包含多个线程D.一个进程只能包含一个线程2.下列说法中错误的一项是()AA.线程就是程序B.线程是一个程序的单个执行流B.多线程是指一个程序的多个执行流D.多线程用于实现并发3.下列哪个一个操作不能使线程从等待阻塞状态进入对象阻塞状态(D)A.等待阴塞状态下的线程被notify()唤B.等待阻塞状态下的纯种被interrput()中断C.等待时间到D.等待阻塞状态下的线程调用wait()方法4.下列哪个方法可以使线程从运行状态进入其他阻塞状态(A)A.sleepB.waitC.yieldD.start5.下列不是进程组成部分的一项是(D)A.代码B.数据C.内核状态D.显示器6.下列哪一个不属于java线程模型的组成部分(D)A.虚拟的CPUB.虚拟CPU执行的代码C. 代码所操作的数据D.执行流7.下列说法中错误的一项是(C)A.Java中的第一个线程都属于某个线程组B.线程只能在其创建时设置所属的线程组C.线程创建之后,可以从一个线程组转移到另一个线程组D.新建的线程默认情况下属于其父线程所属的线程组8.下列不属于线程组成部分的一项是(C)A.程序计数器B.堆栈C. 进程地十空间中的代码D.栈指针9.下列关于JA V A线程模型的说法中,错误的一项是(A)A.Java线程模型包括计算机的CPUB.代码可以与其他线程共享C. 数据可以被多个线程共享D.线程模型在ng.Thread类中被定义10.下列说法中错误的一项是(D)A.一个线程是一个Thread类的实例B.线程从传递给纯种的Runnable实例run()方法开始执行C.线程操作的数据来自Runnable实例D.新建的线程调用start()方法就能立即进入运行状态11.下列关于Thread类提供的线程控制方法的说法中,错误的一项是(D)A.在线程A中执行线程B的join()方法,则线程A等待直到B执行完成B.线程A通过调用interrupt()方法来中断其阻塞状态C.若线程A调用方法isAlive()返回值为true,则说明A正在执行中D.currentThread()方法返回当前线程的引用12.下列说法中,错误的一项是()A.对象锁在synchronized()语句执行完之后由持有它的线程返还B.对象锁在synchronized()语句中出现异常时由持有它的线程返还C.当持有锁的线程调用了该对象的wait()方法时,线程将释放其持有的锁D.当持有锁的线程调用了该对象的构造方法时,线程将释放其持有的锁13.下面的哪一个关键字通宵用来对对象的加锁,从而使得对对象的访问是排他的 AA.sirialize B transient C synchronized D static14.下列关于线程的说法以中,正确的一项是(D)A.由同一类创建的多个线程都同时运行结束B.创建线程只能通过继承ng.Thread类C.调用suspend()方法暂停的一个线程将不会再被重新执行D.程序的执行完毕与超级线程(daemon threads)无关15.下列说法中错误的一项是(C)A.可串行化的类必须实现Serializable接口B.可串行化的类中的静态变量可以不被串行化C.private数据访问权限能够限制数据不被串行化D.对象串行化使用java语言提供的默认机制16.下列说法中错误的一项是(C)A.可串行化的类必须实现Serializable接口B.可串行化的类中的静态变量可以不被串行化C.private数据访问权限能够限制数据不被串行化D.对象串行化java语言提供的默认机制17.下列说法中正确的一项是(A)A.代码和数据是进程的组成部分B.代码和数据是线程的组成部分C. 进程是轻型的线程D.线程中包括线程18. 下列说法中错误的一项是(C)A.java的纯种体由Thread类的run()方法定义B.线程创建时已经确定了提供线程体的对象C.在程序中通过调用Thread类的run()方法创建线程对象D.java中每一个线程都有自己的名字19. 下列说法中错误的一项是(B)A.共享数据的所有访问都必须使用synchronized加锁B.共享数据的访问不一定全部使用synchronized加锁C.所有的对共享数据的访问都是临界区D.临界区必须使用syschronized标识20.下列有关线程的叙述中正确的一项是(B)A.一旦一个线程被创建,它就立即开始运行B.使用start()方法可以使一个线程成为可运行的,但是它不一定立即开始运行C.当一个线程因为抢占机制而停止运行时,它被放在可运行队列的前面D.一个线程可能因为不同的原因而终止并进入终止状态二.填空题1. 在操作系统中,被称做轻型的进程是线程2. 多线程程序设计的含义是可以将一个程序任务分成几个并行的任务3. 在Java程序中,run()方法的实现有两种方式:实现Runnable接口和继承Thread类4.线程的高度是指在单个CPU上以某种顺序运行多个线程5.多个线程并发执行时,各个线程中语句的执行顺序是确定的,但是线程之间的相对执行顺序是不确定的6.Java中的对象锁是一种独占的排他锁7.程序中可能出现一种情况:多个纯种互相等待对方持有的锁,而在得到对方的锁之前都不会释放自己的锁,这就是死锁.8. notyfyAll() 方法将对象wait pool中的所有纯种都移到lock pool中。

C#试题大全--C#考试试题(一)

C#试题大全--C#考试试题(一)

第一版2.列举 页面之间传递值的几种方式。

答. 1).使用QueryString, 如....?id=1; response. Redirect()....2).使用Session变量3).使用Server.Transfer3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少,用递归算法实现。

答:public class MainClass{public static void Main(){Console.WriteLine(Foo(30));}public static int Foo(int i){if (i <= 0)return 0;else if(i > 0 && i <= 2)return 1;else return Foo(i -1) + Foo(i - 2);}}4.C#中的委托是什么?事件是不是一种委托?答:委托可以把一个方法作为参数代入另一个方法。

委托可以理解为指向一个函数的引用。

是,是一种特殊的委托5.override与重载的区别答:override 与重载的区别。

重载是方法的名称相同。

参数或参数类型不同,进行多次重载以适应不同的需要Override 是进行基类中函数的重写。

为了适应需要。

6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Applic ation,您有几种方法进行处理?答:QueryString、FormsAuthentication、this.Server.Transfer7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty?答:foreach (System.Windows.Forms.Control control in this.Controls)if (control is System.Windows.Forms.TextBox){System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; tb.Text = String.Empty ;}}8.请编程实现一个冒泡排序算法?答:int [] array = new int [*] ;int temp = 0 ;for (int i = 0 ; i < array.Length - 1 ; i++){for (int j = i + 1 ; j < array.Length ; j++){if (array[j] < array[i]){temp = array[i] ;array[i] = array[j] ;array[j] = temp ;}}}9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引?答:可以用任意类型。

java关于锁常见面试题

java关于锁常见面试题

java关于锁常见⾯试题1、synchronized作⽤于静态⽅法和⾮静态⽅法的区别⾮静态⽅法:给对象加锁(可以理解为给这个对象的内存上锁,注意只是这块内存,其他同类对象都会有各⾃的内存锁),这时候在其他⼀个以上线程中执⾏该对象的这个同步⽅法(注意:是该对象)就会产⽣互斥静态⽅法: 相当于在类上加锁(*.class位于代码区,静态⽅法位于静态区域,这个类产⽣的对象公⽤这个静态⽅法,所以这块内存,N个对象来竞争),这时候,只要是这个类产⽣的对象,在调⽤这个静态⽅法时都会产⽣互斥。

即该类所有的对象都共享⼀把锁。

2、当⼀个线程进⼊⼀个对象的synchronized⽅法A之后,其它线程是否可进⼊此对象的synchronized⽅法B?不能。

其它线程只能访问该对象的⾮同步⽅法,同步⽅法则不能进⼊。

因为⾮静态⽅法上的synchronized修饰符要求执⾏⽅法时要获得对象的锁,如果已经进⼊A⽅法说明对象锁已经被取⾛,那么试图进⼊B⽅法的线程就只能在等锁池(注意不是等待池哦)中等待对象的锁3、线程同步的⼏种⽅式synchronized修饰volatile实现同步(只能保证可见性,不能保证原⼦性)使⽤局部变量ThreadLocal使⽤原⼦类(AtomicInteger、AtomicBoolean……)使⽤Lock使⽤容器类(BlockingQueue、ConcurrentHashMap)4、synchronized和java.util.concurrent.locks.Lock的异同? 答:Lock 和 synchronized 有⼀点明显的区别 —— lock 必须在 finally 块中释放。

否则,如果受保护的代码将抛出异常,锁就有可能永远得不到释放!这⼀点区别看起来可能没什么,但是实际上,它极为重要。

忘记在 finally 块中释放锁,可能会在程序中留下⼀个定时炸弹,当有⼀天炸弹爆炸时,您要花费很⼤⼒⽓才有找到源头在哪。

15.多线程作业

15.多线程作业

多线程作业一、填空题1.处于运行状态的线程在某些情况下,如执行了sleep(睡眠)方法,或等待I/O设备等资源,将让出CPU并暂时停止自己的运行,进入__休眠_______状态。

2.处于新建状态的线程被启动后,将进入线程队列排队等待CPU,此时它已具备了运行条件,一旦轮到享用CPU资源就可以获得执行机会。

上述线程是处于等待状态。

3.一个正在执行的线程可能被人为地中断,让出CPU的使用权,暂时中止自己的执行,进入终止状态。

4.在Java中编写实现多线程应用有两种途径:一种是继承Thread类创建线程,另一种是实现Runnable接口创建线程。

5.在线程控制中,可以调用_______wate_______方法,阻塞当前正在执行的线程,等插队线程执行完后后再执行阻塞线程。

6.多线程访问某个共享资源可能出现线程安全问题,此时可以使用________________关键字来实现线程同步,从而避免安全问题出现,但会影响性能,甚至出现死锁。

7.在线程通信中,调用wait( )可以是当前线程处于等待状态,而为了唤醒一个等待的线程,需要调用的方法是______________。

8.在线程通信中,可以调用wait()、notify()、notifyAll()三个方法实现线程通信,这三个方法都是______________类提供的public方法,所以任何类都具有这三个方法。

二、选择题1. 下列关于Java线程的说法正确的是()。

(选择一项)A 每一个Java线程可以看成由代码、一个真实的CPU以及数据三部分组成B. 创建线程的两种方法中,从Thread类中继承方式可以防止出现多父类的问题C. Thread类属于java.util程序包D. 使用new Thread(new X()).run();方法启动一个线程2. 以下选项中可以填写到横线处,让代码正确编译和运行的是()。

(选择一项)publicclass Test implements Runnable {publicstaticvoid main(String[] args) {___________________________________t.start();System.out.println("main");}publicvoid run() {System.out.println("thread1!");}}A. Thread t = new Thread(new Test());B. Test t = new Test();C. Thread t = new Test();D. Thread t = new Thread();3. 如下代码创建一个新线程并启动线程,问:四个选项中可以保证正确代码创建target对象,并能编译正确的是()?(选择一项)publicstaticvoid main(String[] args) {Runnable target=new MyRunnable( );Thread myThread=new Thread(target);}A publicclass MyRunnable extends Runnable {publicvoid run() {}}B. publicclass MyRunnable extends Runnable {void run() {}}C. publicclass MyRunnable implements Runnable {publicvoid run() {}}D. publicclass MyRunnable implements Runnable {void run( ) {}}4. 当线程调用start( )后,其所处状态为()。

synchronized关键字的实现原理

synchronized关键字的实现原理

synchronized关键字的实现原理synchronized是Java语言中的一个关键字,用于实现同步和锁。

它的实现原理是基于Java的内置对象锁机制。

当一个线程进入一个synchronized方法或代码块时,它会获取一个锁,这个锁是与该方法或代码块关联的对象。

其他线程如果也想进入这个synchronized对象,则会被阻塞,直到第一个线程释放该对象的锁。

synchronized的实现原理是基于Java的内置对象锁机制。

每个对象都有一个内置锁,当一个线程进入一个synchronized方法或代码块时,它会获取该对象的锁。

其他线程如果也想进入这个synchronized对象,则会被阻塞,直到第一个线程释放该对象的锁。

synchronized的实现原理可以通过Java的内存模型来解释。

Java的内存模型是一种多线程模型,它规定了线程之间如何共享内存和如何访问共享内存。

synchronized关键字可以保证多个线程对共享变量的访问是原子的,也就是说在同一时刻只有一个线程可以访问共享变量。

当一个线程进入一个synchronized方法或代码块时,它首先会尝试获取该对象的锁。

如果该锁已经被其他线程持有,则该线程会被阻塞,直到持有锁的线程释放该锁。

如果该锁没有被持有,则该线程可以进入该方法或代码块并获取该锁。

在synchronized方法或代码块中,只有持有该对象锁的线程才能访问被synchronized保护的代码。

这样可以保证在同一时刻只有一个线程可以访问被synchronized保护的代码,从而保证数据的一致性和安全性。

总之,synchronized是Java语言中一个非常重要的关键字,它可以实现多线程间的同步和锁。

它的实现原理是基于Java的内置对象锁机制和内存模型,可以保证多个线程对共享变量的访问是原子的,从而保证数据的一致性和安全性。

1。

synchronized关键字的用法以及原理

synchronized关键字的用法以及原理

synchronized关键字的用法以及原理synchronized关键字用于控制多个线程对共享资源的访问。

它可以修饰方法、代码块和静态方法,实现线程之间的同步。

使用synchronized关键字可以实现两种类型的锁:对象锁和类锁。

1. 对象锁(方法锁、代码块锁):- 修饰非静态方法:当一个线程访问该对象的同步方法时,其他线程无法同时访问该对象的其他同步方法,但可以同时访问非同步的方法。

- 修饰代码块:当一个线程访问该对象的同步代码块时,其他线程无法同时访问该对象的其他同步代码块,但可以同时访问非同步的代码块。

2. 类锁(静态方法锁):- 修饰静态方法:当一个线程访问该类的同步静态方法时,其他线程无法同时访问该类的其他同步静态方法,但可以同时访问非同步的静态方法。

原理:- 对象锁通过实例对象的监视器锁(monitor)来实现。

每个对象实例都会关联一个监视器,同一时刻只能有一个线程获得该监视器的锁,其他线程需要等待。

- 类锁通过类的Class对象的监视器锁来实现。

同一时刻只能有一个线程获得该监视器的锁,其他线程需要等待。

当一个线程获取了对象锁或类锁之后,可以执行被修饰的代码。

其他线程如果在获取锁时发现已被占用,就会进入等待状态,直到获取到锁才能执行同步代码。

synchronized关键字的原理是基于Java对象头的Mark Word标记和monitor对象监视器实现的。

当一个线程获取对象锁或类锁时,会将锁的状态记录在对象头的Mark Word中,其他线程通过读取Mark Word来判断锁的状态。

如果锁是被占用状态,等待线程会进入到monitor对象的等待队列中,等待被唤醒。

当持有锁的线程释放锁时,会唤醒等待队列中的一个线程,使其获取锁并执行同步代码。

synchronized的几种用法

synchronized的几种用法

synchronized的几种用法synchronized是Java中的关键字,用于实现线程同步,保护共享资源的一致性。

下面将介绍synchronized的几种用法。

1. 修饰实例方法:可以使用synchronized关键字修饰实例方法,以实现对实例级别的锁定。

当一个线程访问该方法时,其他线程需要等待该线程执行完才能访问该方法。

这种用法适用于多个线程同时访问同一个实例的共享资源的情况。

```javapublic synchronized void sharedMethod() {// 操作共享资源的代码}```2. 修饰静态方法:使用synchronized关键字修饰静态方法可以实现对类级别的锁定。

当一个线程访问该静态方法时,其他线程需要等待该线程执行完才能访问该方法。

这种用法适用于多个线程同时访问同一个类的共享资源的情况。

```javapublic static synchronized void sharedStaticMethod() {// 操作共享资源的代码}```3. 修饰代码块:可以使用synchronized关键字修饰代码块,以实现对指定对象的锁定。

当一个线程进入synchronized代码块时,其他线程需要等待该线程执行完才能访问该代码块。

这种用法适用于多个线程同时访问共享资源的情况,但只需要锁定代码块的部分代码。

```javapublic void sharedMethod() {// 非同步代码synchronized (this) {// 操作共享资源的代码}// 非同步代码}```4. 修饰对象:使用synchronized关键字修饰对象,以实现对指定对象的锁定。

当一个线程持有该对象的锁时,其他线程需要等待该线程释放锁才能访问该对象。

这种用法适用于多个线程同时访问共享资源的情况,但需要对不同的共享资源进行分别锁定。

```javapublic void sharedMethod() {synchronized (sharedObject) {// 操作共享资源的代码}}```总结:synchronized关键字可以用于实例方法、静态方法、代码块和对象的修饰,以实现不同级别的锁定。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

当一个线程进入一个对象的一个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 !") ;
}
}
运行结果:
一个线程在访问一个对象的同步方法时,另一个线程不能同时访问这个对象的另一个同步方法。

相关文档
最新文档