在Java中,Synchronized是一种关键字,它可以用来控制并发访问,从而实现线程安全。Synchronized关键字可以应用于方法和代码块,具体实现是通过对象锁来实现的,即每个对象都有一个锁,只有获取了这个锁的线程才能访问这个对象的Synchronized方法或代码块。
下面是一个使用Synchronized的示例:
public class Counter {
private int count;
public synchronized void increment() {
count++;
}
public synchronized int getCount() {
return count;
}
}
public class Main {
public static void main(String[] args) {
Counter counter = new Counter();
Thread t1 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
counter.increment();
}
});
Thread t2 = new Thread(() -> {
for (int i = 0; i < 10000; i++) {
counter.increment();
}
});
t1.start();
t2.start();
try {
t1.join();
t2.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(counter.getCount());
}
}
在上面的代码中,我们创建了一个Counter类,其中使用了Synchronized关键字来保证increment()和getCount()方法的原子性。我们创建了两个线程来分别对count变量进行10000次自增操作,并在主线程中等待两个线程执行完毕后输出count变量的值。
由于使用了Synchronized,我们可以确保每个线程都能够正确地自增count变量,并且最终输出的结果也是正确的。需要注意的是,Synchronized虽然能够保证线程安全,但是也会带来一些性能上的损失,因为在获取锁的过程中可能会发生阻塞,从而影响程序的运行效率。因此,在实现线程安全的时候需要根据具体情况选择合适的方案。