Java多线程编程之Synchronized关键字详解
什么是Synchronized关键字
Synchronized是一种Java中的关键字,可以将一段代码标记为“临界区”,保证多个线程在执行该代码时不会发生冲突,保证数据的正确性。
Synchronized关键字的用法
Synchronized关键字可以用在方法或代码块上。
用在方法上
public synchronized void method1() {
// some code
}
上述代码中,方法前面的synchronized
关键字表示这是一个同步方法,在这个方法内部,所有的对象锁都被Java自动取得和释放。
用在代码块上
public void method2() {
synchronized (object) {
// some code
}
}
上述代码以object为锁,表示代码块被一个对象锁保护起来。在代码块内部,只有取得object锁的线程才能执行该代码块。
Synchronized关键字的使用场景
多线程访问共享变量
当多个线程同时访问共享变量时,如果不使用Synchronized关键字对代码进行同步,就有可能出现多个线程同时修改变量的情况,破坏数据的正确性。
class MyThread implements Runnable {
private int count = 0;
public void run() {
for (int i = 0; i < 10; i++) {
count++;
}
System.out.println(Thread.currentThread().getName() + ":" + count);
}
}
上述代码定义了一个实现了Runnable接口的线程类,其中count变量为共享变量,在run方法中进行递增操作,但是这个类将会被多个线程同时访问,从而导致count的值不稳定。
解决方法就是在run()
方法上添加synchronized
关键字,使得线程在执行run()
方法时只有一个线程被执行。
单例模式
在单例模式中,通常会在类的内部创建一个静态实例,并提供一个静态方法来获取该实例。但是如果多个线程同时访问该静态方法,就可能出现多个实例的情况。
在这种情况下,可以使用Synchronized关键字使得静态方法只能被一个线程访问,确保只有一个实例被创建。
Synchronized关键字可能导致的问题
性能问题
当一个线程持有锁时,其他线程无法获得锁,从而降低了多线程并发执行的效率。因此,在使用Synchronized时要注意降低锁竞争的问题。
死锁问题
当两个线程互相持有对方已经持有锁的对象时,就会导致死锁。这时候需要使用同步块来避免死锁问题。
示例说明
下面是一个利用Synchronized关键字实现线程安全的示例。
class MyThread implements Runnable {
private int count = 0;
public synchronized void run() {
for (int i = 0; i < 10; i++) {
count++;
}
System.out.println(Thread.currentThread().getName() + ":" + count);
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
Thread t1 = new Thread(thread);
Thread t2 = new Thread(thread);
t1.start();
t2.start();
}
}
在上述代码中,run()
方法被添加了synchronized
关键字,确保了线程安全。同时,两个线程共用了一个MyThread实例,由此可以看出线程安全是可以实现共享变量的。
另一个示例是下面的单例模式,使用Synchronized确保只创建一个实例。
public class Singleton {
private static Singleton instance = null;
private Singleton() { }
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
上述代码中,getInstance()
方法添加了synchronized
关键字,保证只有在创建实例时只有一个线程执行。这样就可以避免多个线程同时调用该方法而导致创建多个实例的问题。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java多线程编程之Synchronized关键字详解 - Python技术站