java synchronized修饰实例方法的作用,举例说明
时间: 2023-08-12 20:25:22 浏览: 52
Java中synchronized关键字可以用于修饰方法、语句块和静态方法,其中修饰实例方法时可以实现对实例对象进行同步控制。
当一个方法被synchronized修饰时,同一时刻只能有一个线程访问该方法,其他线程需要等待当前线程执行完该方法后才能进入该方法。
下面是一个使用synchronized修饰实例方法的示例:
```
public class Example {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized void decrement() {
count--;
}
public synchronized int getCount() {
return count;
}
}
```
在这个示例中,increment()、decrement()和getCount()方法都被synchronized修饰,因此同一时刻只有一个线程能够访问这些方法,保证了对count变量的同步控制,避免了多线程并发访问时的数据竞争问题。
相关问题
java synchronized修饰非静态方法的作用,举例说明
当Java中的实例方法被synchronized修饰时,该方法成为线程安全的,同一时刻只能有一个线程访问该方法,其他线程需要等待当前线程执行完该方法后才能进入该方法。这种方式可以保证多线程环境下实例变量的线程安全性。
下面是一个使用synchronized修饰非静态方法的示例:
```
public class Example {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized void decrement() {
count--;
}
public synchronized int getCount() {
return count;
}
}
```
在这个示例中,increment()、decrement()和getCount()方法都被synchronized修饰,因此同一时刻只有一个线程能够访问这些方法,保证了对count变量的同步控制,避免了多线程并发访问时的数据竞争问题。
需要注意的是,synchronized修饰的实例方法是基于实例对象的锁,不同的实例对象之间互相独立,不会互相影响。
Java synchronized 修饰符
Java中的synchronized修饰符用于实现线程同步,确保多个线程在访问共享资源时的安全性。它可以修饰方法和代码块。
1. 修饰方法:
```java
public synchronized void method() {
// todo
}
```
上述代码中,synchronized修饰的方法在同一时间只能被一个线程访问,其他线程需要等待。
2. 修饰代码块:
```java
public void run() {
synchronized (this) {
for (int i = 0; i < 5; i++) {
try {
System.out.println(Thread.currentThread().getName() + ":" + (count++));
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
```
上述代码中,synchronized修饰的代码块使用this作为锁对象,同一时间只能有一个线程进入该代码块执行。
3. 修饰静态方法:
```java
public synchronized static void method() {
// todo
}
```
上述代码中,synchronized修饰的静态方法在同一时间只能被一个线程访问,其他线程需要等待。
需要注意的是,synchronized关键字不能继承,子类需要重新添加synchronized关键字来实现同步。