「java静态方法锁」java方法锁和静态锁
本篇文章给大家谈谈java静态方法锁,以及java方法锁和静态锁对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、java的静态同步锁会影响实例化该类的过程吗
- 2、java静态锁和实例锁的区别
- 3、Java中的静态方法是什么?
- 4、java synchronized对静态方法加锁
- 5、java静态的方法怎么设置锁'
- 6、java 对象锁和方法锁有什么区别
java的静态同步锁会影响实例化该类的过程吗
看到你提的问题发现自己也没有思考过,然后找了一篇文章感觉里面讲的挺好。
网页链接
java静态锁和实例锁的区别
静态锁: 在静态方法前面加上synchronized方法表示锁定此类,当多个线程调用这个类中的静态方法时会阻塞。
实例锁: 在实例方法前面加上synchronized方法表示锁定类的单个实例,当多个线程调用一个类申明的同一个实例的实例方法是会阻塞。
但静态锁和实例锁两者间的同步并不会受到互相干扰
Java中的静态方法是什么?
静态方法是在类中使用staitc修饰的方法,在类定义的时候已经被装载和分配。
静态方法为类所有,可以通过对象来使用,也可以通过类来使用。
我们之前一直写的mian方法仔细看看,它就是一个静态方法,静态方法使用如下:
运行结果:
使用静态方法时,要注意:
1、静态方法可以调用同类中的其他成员,但不能直接调用非静态成员,如:
运行结果:
2、但是如果希望静态方法中调用非静态成员,可以通过创建类的对象 ,然后通过对象来访问非静态变量。如
运行结果:
3、静态方法同样不能直接调用非静态方法,但可以通过对象来访问非静态方法,如:
运行结果:
java synchronized对静态方法加锁
2所有的非静态同步方法用的都是同一把锁——实例对象本身,也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁,可是别的实例对象的非静态同步方法因为跟该实例对象的非静态同步方法用的是不同的锁,所以毋须等待该实例对象已获取锁的非静态同步方法释放锁就可以获取他们自己的锁。
而所有的静态同步方法用的也是同一把锁——类对象本身,这两把锁是两个不同的对象,所以静态同步方法与非静态同步方法之间是不会有竞态条件的。但是一旦一个静态同步方法获取锁后,其他的静态同步方法都必须等待该方法释放锁后才能获取锁,而不管是同一个实例对象的静态同步方法之间,还是不同的实例对象的静态同步方法之间,只要它们同一个类的实例对象!
java静态的方法怎么设置锁'
public class Walk {
public static int num = 100;
public static Walk walk = new Walk();
// 静态
public synchronized static int run(){
int i = 0;
while (i 10) {
try {
num --;
i++;
System.out.println(Thread.currentThread().getName()+":"+num);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return num ;
}
// 非静态
public synchronized int walk(){
int i = 0;
while (i 10) {
try {
num --;
i++;
System.out.println(Thread.currentThread().getName()+":"+num);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return num ;
}
}
java 对象锁和方法锁有什么区别
对象锁类锁
对象锁
当一个对象中有synchronized
method或synchronized
block的时候调用此对象的同步方法或进入其同步区域时,就必须先获得对象锁。如果此对象的对象锁已被其他调用者占用,则需要等待此锁被释放
同步静态方法/静态变量互斥体
由于一个class不论被实例化多少次,其中的静态方法和静态变量在内存中都只由一份。所以,一旦一个静态的方法被申明为synchronized。此类所有的实例化对象在调用此方法,共用同一把锁,我们称之为类锁。一旦一个静态变量被作为synchronized
block的mutex。进入此同步区域时,都要先获得此静态变量的对象锁
类锁
由上述同步静态方法引申出一个概念,那就是类锁。其实系统中并不存在什么类锁。当一个同步静态方法被调用时,系统获取的其实就是代表该类的类对象的对象锁
在程序中获取类锁
可以尝试用以下方式获取类锁
synchronized
(xxx.class)
{...}
synchronized
(Class.forName("xxx"))
{...}
同时获取2类锁
同时获取类锁和对象锁是允许的,并不会产生任何问题,但使用类锁时一定要注意,一旦产生类锁的嵌套获取的话,就会产生死锁,因为每个class在内存中都只能生成一个Class实例对象。
关于java静态方法锁和java方法锁和静态锁的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-11-24,除非注明,否则均为
原创文章,转载请注明出处。