No enclosing instance of type * is accessible. Must qualify the allocation with an enclosing instanc

本文通过一段多线程代码示例介绍了Java中内部类的使用限制及sleep()方法的行为特点。当内部类不是静态时,在静态上下文中创建会引发错误。同时,sleep()方法在不释放synchronized锁的情况下使线程进入短暂休眠。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天在一位大神的博客中学习多线程的知识,其中有一段关于线程中sleep()方法的测试代码,内容如下:

public class SleepLockTest{ 

     private static Object obj = new Object();

     public static void main(String[] args){ 
         ThreadA t1 = new ThreadA("t1"); 
         ThreadA t2 = new ThreadA("t2"); 
         t1.start(); 
         t2.start();
     } 

     static class ThreadA extends Thread{
         public ThreadA(String name){ 
             super(name); 
         } 
         public void run(){ 
             // 获取obj对象的同步锁
             synchronized (obj) {
                 try {
                     for(int i=0; i <10; i++){ 
                         System.out.printf("%s: %d\n", this.getName(), i); 
                         // i能被4整除时,休眠100毫秒
                         if (i%4 == 0)
                             Thread.sleep(100);
                     }
                 } catch (InterruptedException e) {
                     e.printStackTrace();
                 }
             }
         } 
     } 
 } 

我们知道,sleep()方法会让线程进去休眠状态,但是并不释放当前所持有的同步锁(synchronized (obj)),所以这个代码最后的结果肯定是 t1 线程先执行完,然后 t2线程继续执行。但我今天发现的一个知识点是关于内部类,因为工作中很少涉及内部类,所以这段知识有些匮乏,现在发现问题,就先将这个小问题整理一下。


当我试图将 内部类ThreadAstatic 关键字去掉的时候,编译器会在new ThreadA的时候告诉我这个错:

No enclosing instance of type SleepLockTest is accessible. Must qualify the allocation with an enclosing instance of type SleepLockTest (e.g. x.new A() where x is an instance of SleepLockTest).

这句话的大概意思是:没有可访问的内部类SleepLockTest 的实例,必须分配一个合适的内部类SleepLockTest 的实例(如x.new A(),x必须是SleepLockTest 的实例。)
这是因为我是在static void main 方法中 试图创建一个非静态内部类,但是在java中,类中的静态方法不能直接调用动态方法(调用非静态内部类ThreadA的构造方法)。只有将某个内部类修饰为静态类,然后才能够在静态类中调用该类的成员变量与成员方法。所以要将static 关键字加上,或者将new ThreadA 放到main 方法外面的非静态区域中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值