java中synchronized问题
发布网友
发布时间:2022-05-02 04:06
我来回答
共3个回答
热心网友
时间:2022-06-28 01:31
synchronized 关键字,代表这个方法加锁,相当于不管哪一个线程(例如线程A),运行到这个方法时,都要检查有没有其它线程B(或者C、 D等)正在用这个方法,有的话要等正在使用synchronized方法的线程B(或者C 、D)运行完这个方法后再运行此线程A,没有的话,直接运行。它包括两种用法:synchronized 方法和 synchronized 块。
回答你的问题? 这两个方法互相没有影响。如果第一个方法执行到sleep时,它会休眠,之后接着执行;第二个线程中的方法从头执行到尾。
热心网友
时间:2022-06-28 01:31
synchronized是java中表示同步代码快的关键字。可以放在方法修饰符前,比如private synchronized void test(){},也可以放在方法内部,修饰某一段特定的代码。可能你贴出完整的代码会清晰一点,synchronized有一个地方需要注意,就是在给普通方法加锁与给静态方法加锁机制是不一样的。
synchronized在静态方法上表示调用前要获得类的锁,而在非静态方法上表示调用此方法前要获得对象的锁。
public class StaticSynDemo {
private static String a="test";
//等同于方法print2
public synchronized void print1(String b){ //调用前要取得StaticSynDemo实例化后对象的锁
System.out.println(b+a);
}
public void print2(String b){
synchronized (this) {//取得StaticSynDemo实例化后对象的锁
System.out.println(b+a);
}
}
//等同于方法print4
public synchronized static void print3(String b){//调用前要取得StaticSynDemo.class类的锁
System.out.println(b+a);
}
public static void print4(String b){
synchronized (StaticSynDemo.class) { //取得StaticSynDemo.class类的锁
System.out.println(b+a);
}
-----------
a.sleep()休眠,但是这个线程没有结束,也就是说不会释放synchronized里面的东西,具体的还要看你的synchronized锁的范围和.sleep()在的位置而定
热心网友
时间:2022-06-28 01:32
你说的有点糊涂,一个方法内部有sleep,另一个没有?两个线程调哪个方法?