目录
两个方法都被synchronized修饰,其中一个调用另一个可以成功嘛?synchronized修饰方法锁的那一部分?
计算机基础
ARM有了解嘛?
了解不过,大概知道是一个处理器,嵌入式领域用的多。
二进制怎么转16机制?
可以采用分组转换法。
分组转换法基于二进制和十六进制之间的位权关系。因为2^4=16,这意味着 4 位二进制数能够表示的状态数刚好与十六进制的一位所能表示的状态数相同。所以可以将二进制数按每 4 位一组进行划分,每一组都能唯一地对应一个十六进制数字。
下面我给出了二进制的数,我们将它转换为十六进制,例如:0101101,我们将这个数按4个一组来划分,变成 0010 1101(这里本来是010 1101前面不够4位我们就凑一个0),可以得到 0010 =2、 1101=D 所以转换成十六进制就是2D。
byte类型的-1怎么表示?
byte
类型是有符号的 8 位整数,取值范围是-128
到127
。-1
在byte
类型中的二进制表示是补码形式,正数的补码与原码相同,负数的补码是在反码的基础上加 1,这是因为计算机中采用补码来进行减法运算,可以将减法转换为加法,方便硬件实现,计算过程如下:
-
先写出
1
的原码:00000001
。 -
然后得到
-1
的原码:10000001
。 -
接着求
-1
的反码:11111110
。 -
最后求
-1
的补码:11111111
。
所以,在 Java 的byte
类型中,-1
用二进制补码表示为11111111
。当进行运算或存储时,计算机使用这个补码来处理-1
相关的操作。例如,在进行加法运算时,-1 + 1
的计算过程如下:
-
- 1
的补码是11111111
,1
的补码是00000001
。 -
相加得到:
11111111 + 00000001 = 100000000
(9 位,超出byte
范围)。 -
由于
byte
类型是 8 位,会发生截断,得到00000000
,也就是0
,这符合数学运算结果。
Java
两个方法都被synchronized修饰,其中一个调用另一个可以成功嘛?synchronized修饰方法锁的那一部分?
如果两个方法都被synchronized
修饰,一个方法内部调用另一个方法是可以成功的。这是因为synchronized
方法默认是对当前对象(this
)加锁。当一个线程进入了一个synchronized
方法,它已经获得了该对象的锁,在这个方法内部调用另一个synchronized
方法时,由于是同一个对象的锁,所以线程可以继续执行被调用的synchronized
方法,不会出现锁竞争导致无法调用的情况。
例如下面的代码,method1
调用method2
时,因为它们都是同一个对象example
的synchronized
方法,所以可以正常执行。
public class SynchronizedExample {
public synchronized void method1() {
System.out.println("Method 1 started");
method2();
System.out.println("Method 1 ended");
}
public synchronized void method2() {
System.out.println("Method 2 is running");
}
public static void main(String[] args) {
SynchronizedExample example = new SynchronizedExample();
example.method1();
}
}
synchronized 修饰方法锁的对象:
-
对于非静态方法:当
synchronized
修饰一个非静态方法时,锁的是当前对象(this
)。这意味着同一时刻,对于同一个对象实例,只有一个线程能够执行这个对象的synchronized
非静态方法。不同的对象实例之间的synchronized
非静态方法可以被不同的线程同时执行,因为它们的锁对象(this
)是不同的。 -
对于静态方法:当
synchronized
修饰一个静态方法时,锁的是这个类的Class
对象。因为静态方法是属于类的,而不是属于某个具体的对象实例。所以同一时刻,对于一个类的所有实例,只有一个线程能够执行这个类的synchronized
静态方法。例如,下面的例子,staticMethod1
和staticMethod2
都是静态的synchronized
方法,它们共享同一个类的Class
对象作为锁。所以当thread1
和thread2
同时启动时,其中一个方法会先获得类的Class
对象锁,另一个方法需要等待锁释放后才能执行。
public class SynchronizedStaticExample {
public static synchronized void staticMethod1() {
System.out.println("Static Method 1 started");
}
public static synchronized void staticMethod2() {
System.out.println("Static Method 2 started");
}
public static void main(String[] args) {
Thread thread1 = new Thread(() -> {
SynchronizedStaticExample.staticMethod1();
});
Thread thread2 = new Thread(() -> {
SynchronizedStaticExample.staticMethod2();
});
thread1.start();
thread2.start();
}
}
静态内部类和匿名内部类有什么区别吗?
静态内部类是定义在另一个类内部的类,并且使用static
关键字修饰。它就像是类的一个静态成员,不依赖于外部类的实例,就像下面的例子中,StaticInnerClass
可以直接访问OuterClass
的outerStaticVar
静态变量。