让我来详细讲解“一个例子带你看懂Java中synchronized关键字到底怎么用”的完整攻略。
完整攻略
什么是synchronized关键字?
synchronized
是Java中的一个关键字,用于线程之间的同步操作。它的作用是给代码块或方法加锁,保证同一时刻只有一个线程可以进入被加锁的代码块或方法。
synchronized关键字的用法
synchronized
关键字有两种用法:加在方法上和加在代码块上。
方法上用法
public synchronized void method() {
// 方法体
}
在方法上使用synchronized
关键字相当于给整个方法加锁,使得同一时刻只有一个线程可以进入该方法。需要注意的是,这种用法锁住的是当前对象,因此如果多个线程访问的是同一个对象,则只有一个线程可以执行该方法。
代码块上用法
synchronized (obj) {
// 代码块
}
在代码块中使用synchronized
关键字相当于给代码块所在的对象加锁,使得同一时刻只有一个线程可以进入该代码块。需要注意的是,这种用法锁住的是指定的对象,因此需要在使用前确定对象的唯一性。
示例一
下面我们来看一个使用synchronized
关键字的例子,该例子展示了在方法上使用synchronized
关键字。
public class MyThread implements Runnable {
private int count = 5;
@Override
public synchronized void run() {
count--;
System.out.println(Thread.currentThread().getName() + " count = " + count);
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
for (int i = 0; i < 5; i++) {
new Thread(myThread, "Thread-" + i).start();
}
}
}
在上面的代码中,我们创建了一个实现Runnable
接口的类MyThread
,该类有一个成员变量count
,初始值为5,每执行一次run()
方法就将count
减1。在main()
方法中,我们使用for
循环创建了5个线程,每个线程都执行MyThread
对象中的run()
方法。如果不加锁,则可能出现并发问题,count
的值可能会出现不正确的情况。但是加上synchronized
关键字后,同一时刻只有一个线程可以进入run()
方法,从而保证了count
的值不会出现并发问题。
示例二
下面再来一个示例,该示例展示了在代码块中使用synchronized
关键字。
public class MyThread implements Runnable {
private int count = 5;
private Object lock = new Object();
@Override
public void run() {
synchronized (lock) {
count--;
System.out.println(Thread.currentThread().getName() + " count = " + count);
}
}
public static void main(String[] args) {
MyThread myThread = new MyThread();
for (int i = 0; i < 5; i++) {
new Thread(myThread, "Thread-" + i).start();
}
}
}
在上面的代码中,我们创建了一个实现Runnable
接口的类MyThread
,该类有一个成员变量count
,初始值为5,每执行一次run()
方法就将count
减1。在main()
方法中,我们使用for
循环创建了5个线程,每个线程都执行MyThread
对象中的run()
方法。如果不加锁,则可能出现并发问题,count
的值可能会出现不正确的情况。但是加上synchronized
关键字后,同一时刻只有一个线程可以进入代码块,从而保证了count
的值不会出现并发问题。需要注意的是,这里需要在使用前确定对象lock
的唯一性,否则可能出现多个对象同时加锁的情况。
总结
synchronized
关键字是Java中保证线程安全的一种重要机制,它可以使多个线程之间互斥访问资源,从而避免了并发问题的发生。在实际使用中,一定要根据实际需求灵活选择方法锁或代码块锁,并保证锁住的对象的唯一性。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一个例子带你看懂Java中synchronized关键字到底怎么用 - Python技术站