You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@harmony.apache.org by "Vera Petrashkova (JIRA)" <ji...@apache.org> on 2006/10/20 12:40:36 UTC
[jira] Updated: (HARMONY-1930) [drlvm][classlib]
java.lang.Class.newInstance() sometimes returns unexpected
IllegalAccessException when several threads try to create instance of
package access class
[ http://issues.apache.org/jira/browse/HARMONY-1930?page=all ]
Vera Petrashkova updated HARMONY-1930:
--------------------------------------
Attachment: testClassNewInstance.zip
Attached testClassNewInstance.zip contains test source code and class files
> [drlvm][classlib] java.lang.Class.newInstance() sometimes returns unexpected IllegalAccessException when several threads try to create instance of package access class
> -----------------------------------------------------------------------------------------------------------------------------------------------------------------------
>
> Key: HARMONY-1930
> URL: http://issues.apache.org/jira/browse/HARMONY-1930
> Project: Harmony
> Issue Type: Bug
> Components: DRLVM
> Environment: Windows and Linux
> Reporter: Vera Petrashkova
> Attachments: testClassNewInstance.zip
>
>
> If some public method declared in the public class creates new instance of the package access class
> and this method is invoked by several threads then result is not stable.
> Sometimes java.lang.Class.newInstance() throws IllegalAccessException.
> Code for reproducing:
> -----------------testClassNewInstance.java--------------
> public class testClassNewInstance extends Thread {
> private static String[] clsN = { "testClassNewInstance", "cl1", "cl2", "cl11",
> "cl12", "cl21", "cl22", "cl111", "cl112", "cl121", "cl122",
> "cl211", "cl212", "cl221", "cl222", "cl1111", "cl1112", "cl1121",
> "cl1122", "cl1211", "cl1212", "cl1221", "cl1222", "cl2111",
> "cl2112", "cl2121", "cl2122", "cl2211", "cl2212", "cl2221",
> "cl2222" };
> public int test() {
> String nm = "";
> try {
> for (int t = clsN.length - 1; t >=0; t--) {
> nm = clsN[t];
> Class cl = Class.forName(nm);
> testClassNewInstance t3 = (testClassNewInstance)cl.newInstance();
> }
> } catch (Throwable e) {
> e.printStackTrace(System.err);
> return 106;
> }
> return 104;
> }
> public static int thN = 10;
> private int index;
> public testClassNewInstance(int index) {
> this.index = index;
> }
> public testClassNewInstance() {
> this.index = -1;
> }
> public void run() {
> System.err.println("Thread: "+this.index+" res="
> +new testClassNewInstance().test());
> }
> public static void main(String [] args) {
> try {
> // the first argument defines the number of threads
> // (default value: 10)
> if (args.length > 0) {
> thN = Integer.parseInt(args[0]);
> }
> Thread [] tt = new testClassNewInstance[thN];
> for (int t = 0; t < thN; t++) {
> tt[t] = new testClassNewInstance(t);
> }
> for (int t = 0; t < thN; t++) {
> tt[t].start();
> }
> for (int t = 0; t < thN; t++) {
> tt[t].join();
> }
> } catch (Throwable e) {
> e.printStackTrace();
> }
> }
> }
> class cl1 extends testClassNewInstance {
> }
> class cl11 extends cl1 {
> }
> class cl12 extends cl1 {
> }
> class cl111 extends cl11 {
> }
> class cl112 extends cl11 {
> }
> class cl121 extends cl12 {
> }
> class cl122 extends cl12 {
> }
> class cl1111 extends cl111 {
> }
> class cl1112 extends cl111 {
> }
> class cl1121 extends cl112 {
> }
> class cl1122 extends cl112 {
> }
> class cl1211 extends cl121 {
> }
> class cl1212 extends cl121 {
> }
> class cl1221 extends cl122 {
> }
> class cl1222 extends cl122 {
> }
> class cl2 extends testClassNewInstance {
> }
> class cl21 extends cl2 {
> }
> class cl22 extends cl2 {
> }
> class cl211 extends cl21 {
> }
> class cl212 extends cl21 {
> }
> class cl221 extends cl22 {
> }
> class cl222 extends cl22 {
> }
> class cl2111 extends cl211 {
> }
> class cl2112 extends cl211 {
> }
> class cl2121 extends cl212 {
> }
> class cl2122 extends cl212 {
> }
> class cl2211 extends cl221 {
> }
> class cl2212 extends cl221 {
> }
> class cl2221 extends cl222 {
> }
> class cl2222 extends cl222 {
> }
> -----------------------------------------------------
> The result is not stable so run one of these commands several times (~10).
> java -cp . testClassNewInstance 5
> java -cp . testClassNewInstance
>
> Output on RI:
> --------------------------
> java version "1.5.0_06"
> Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_06-b05)
> Java HotSpot(TM) Client VM (build 1.5.0_06-b05, mixed mode)
> Thread: 4 res=104
> Thread: 0 res=104
> Thread: 3 res=104
> Thread: 1 res=104
> Thread: 2 res=104
>
>
> Output on Harmony:
> ----------------------------
> Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors, as applicable.
> java version "1.5.0"
> pre-alpha : not complete or compatible
> svn = r464471, (Oct 20 2006), Linux/ia32/gcc 3.3.3, release build
> http://incubator.apache.org/harmony
> java.lang.IllegalAccessException: A member of the "class cl2221" with "" modifiers can not be accessed from the "class java.lang.Class"
> at java.lang.reflect.ReflectExporter.checkMemberAccess(Unknown Source)
> at java.lang.reflect.Constructor.newInstance(Unknown Source)
> at java.lang.Class.newInstance(Unknown Source)
> at testClassNewInstance.test(testClassNewInstance.java:15)
> at testClassNewInstance.run(testClassNewInstance.java:35)
> java.lang.IllegalAccessException: A member of the "class cl2221" with "" modifiers can not be accessed from the "class java.lang.Class"
> at java.lang.reflect.ReflectExporter.checkMemberAccess(Unknown Source)
> at java.lang.reflect.Constructor.newInstance(Unknown Source)
> at java.lang.Class.newInstance(Unknown Source)
> at testClassNewInstance.test(testClassNewInstance.java:15)
> at testClassNewInstance.run(testClassNewInstance.java:35)
> java.lang.IllegalAccessException: A member of the "class cl2221" with "" modifiers can not be accessed from the "class java.lang.Class"
> at java.lang.reflect.ReflectExporter.checkMemberAccess(Unknown Source)
> at java.lang.reflect.Constructor.newInstance(Unknown Source)
> at java.lang.Class.newInstance(Unknown Source)
> at testClassNewInstance.test(testClassNewInstance.java:15)
> at testClassNewInstance.run(testClassNewInstance.java:35)
> Thread: 1 res=106
> Thread: 4 res=106
> Thread: 0 res=106
> Thread: 2 res=104
> Thread: 6 res=104
> Thread: 7 res=104
> Thread: 3 res=104
> Thread: 9 res=104
> Thread: 5 res=104
> Thread: 8 res=104
>
> Apache Harmony Launcher : (c) Copyright 1991, 2006 The Apache Software Foundation or its licensors, as applicable.
> java version "1.5.0"
> pre-alpha : not complete or compatible
> svn = r464471, (Oct 20 2006), Windows/ia32/msvc 1310, release build
> http://incubator.apache.org/harmony
> java.lang.IllegalAccessException: A member of the "class cl1222" with "" modifiers can not
> be accessed from the "class java.lang.Class"
> at java.lang.reflect.ReflectExporter.checkMemberAccess(Unknown Source)
> at java.lang.reflect.Constructor.newInstance(Unknown Source)
> at java.lang.Class.newInstance(Unknown Source)
> at testClassNewInstance.test(testClassNewInstance.java:15)
> at testClassNewInstance.run(testClassNewInstance.java:35)
> Thread: 2 res=104
> Thread: 3 res=104
> java.lang.IllegalAccessException: A member of the "class cl1222" with "" modifiers can not
> be accessed from the "class java.lang.Class"
> at java.lang.reflect.ReflectExporter.checkMemberAccess(Unknown Source)
> at java.lang.reflect.Constructor.newInstance(Unknown Source)
> at java.lang.Class.newInstance(Unknown Source)
> at testClassNewInstance.test(testClassNewInstance.java:15)
> at testClassNewInstance.run(testClassNewInstance.java:35)
> Thread: 0 res=104
> Thread: 4 res=106
> Thread: 1 res=106
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira