在Java中,synchronized是一种关键字,它被用来实现线程的同步。当多个线程在操作共享资源时,如果没有同步机制,就会出现线程安全问题,synchronized关键字可以保证在同一时刻只有一个线程可以访问被保护的资源,从而避免了线程安全问题。
synchronized可以用在方法或代码块上,下面分别介绍:
-
用于方法上:
语法:public synchronized void methodName() {...}
当一个线程调用该方法时,其他线程必须等待当前线程执行完毕后才能调用该方法。此时,锁住的对象是当前对象(即这个方法所在的实例对象),也可以使用synchronized关键字锁住某个对象。
示例代码:
public class SynchronizedExample { public synchronized void method1() { // 这里是同步代码块 } public void method2() { synchronized (this) { // 这里是同步代码块 } } }
-
用于代码块上:
语法:synchronized(object) {...}
当一个线程执行到synchronized关键字所定义的同步代码块时,先尝试获取object对象的锁,如果可以获取到锁,就可以执行该代码块中的代码,执行完成后就会释放该锁。
示例代码:
public class SynchronizedExample { public void method1() { synchronized (this) { // 这里是同步代码块 } } public void method2() { Object obj = new Object(); synchronized (obj) { // 这里是同步代码块 } } }
需要注意的是,synchronized是一种重量级的锁机制,因此在并发量较高的情况下,可能会影响性能。而且,synchronized只能锁住一个对象,如果需要同步多个对象,就需要使用其他的锁机制,如ReentrantLock。
另外,如果使用synchronized关键字,最好保证同步块代码的执行时间尽可能短,这样可以减少锁的竞争,提高程序的并发性能。