❶ java synchronized 有两种用法一种是方法上加synchronized ,还有一种是什么
synchronized
语句块,可以方便的写在方法内的某段。用法:synchronized
(对象地址){
逻辑
}
synchronized
的意思就是
先获得对象地址的锁,那么就可以先执行那部分代码。执行完就放开锁其他线程就可以进来了。
synchronized
void
getName()这个代码表示
以this类实例为对象地址相当于synchronized
(this){}.
那么在多线程环境中。如果访问同一个类同一个实例的这个方法,就会被同步
❷ synchronized 加在java方法前面是什么作用
java的synchronized加在方法上或者对象上区别如下:
1.synchronized
在方法上,所有这个类的加了
synchronized
的方法,在执行时,会获得一个该类的唯一的同步锁,当这个锁被占用时,其他的加了
synchronized
的方法就必须等待
2.加在对象上的话,就是以这个对象为锁,其他也以这个对象为锁的代码段,在这个锁被占用时,就必须等待
❸ Java中synchronized的作用,什么情况下使用
synchronized是java中的一个关键字
我们称其为同步关键字
主要是用来处理java中的同步机制
同一个资源被用户并发访问时,会出现并发问题,比如:有一个实例变量x,第一个用户访问它,并赋值为100,但还没有来得及打印出x,另一个哥们进来访问了x,并改为200,这时候第一个哥们兴高采烈的打印出x的值,但却发现不是100,是200.这哥们就郁闷了,怎么回事呢?
这就是并发问题,但如果把上面的代码用同步代码块包含起来,任意一个时间只能有一个哥们访问实例变量x,一直到这哥们执行完同步代码块中的所有代码后,其他哥们才能再访问。
❹ java,synchronized问题
前者表示从this对象即当前对象上获得锁后,才执行f();
后者是错误句子。不能这么写。synchronzied只能声明“同步块”,或者放在方法前面声明“同步方法”
❺ Java synchronized的问题
问题呢?同步代码块
❻ java 中 synchronized 是什么意思
一段synchronized的代码被一个线程执行之前,他要先拿到执行这段代码的权限,在java里边就是拿到某个同步对象的锁(一个对象只有一把锁);
如果这个时候同步对象的锁被其他线程拿走了,他(这个线程)就只能等了(线程阻塞在锁池等待队列中)。
取到锁后,他就开始执行同步代码(被synchronized修饰的代码);线程执行完同步代码后马上就把锁还给同步对象,其他在锁池中等待的某个线程就可以拿到锁执行同步代码了。这样就保证了同步代码在统一时刻只有一个线程在执行。
关于线程的同步,一般有以下解决方法:
1.
在需要同步的方法的方法签名中加入synchronized关键字。
2.
使用synchronized块对需要进行同步的代码段进行同步。
3.
使用JDK
5中提供的java.util.concurrent.lock包中的Lock对象
❼ Java的synchronized加在方法上或者对象上有什么区别
Java的synchronized可以加在方法上,也可以直接加在对象上,从而保证一段代码只能有一个线程在运行,保证线程的同步。
详情请见:http://blog.csdn.net/loveyaqin1990/article/details/41313285
❽ java中synchronized问题
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()在的位置而定