前言:相信大家在进行Java开发的时候经常会接触到同步的概念,在多线程并发的情况下,为保证同一个时间点只能被一个线程访问到,就需要用到同步机制。想要了解更多关于Java多线程知识,请移步:Android多线程机制专栏
对于一段代码片,或者一个方法怎么进行线程同步?这时就会用到我们今天的主角(synchronized)了。我们日常使用synchronized的时候,经常会直接在方法前面加上synchronized关键字,或者用synchronized(this)直接修饰一段代码片等,就能实现同步操作了。但是不同的使用情况有什么区别?作用范围又是什么?相信还是有很多同学不甚了解吧。其实它涉及到类锁和对象锁两个概念呢!!
今天我们就一起来探讨synchronized的多种用法,通过代码来分析各种情况的意义和原理。
- 首先我们模拟多线程同时访问一个类的被synchronized修饰方法和未被synchronized修饰的方法:
(1)在person内部有synchronized修饰方法和普通方法:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public synchronized void sayHello(){
for(int i=0;i<3;i++){
try {
System.out.println(name+" say hello: "+i);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
public void sayWelcome(){
for(int i=0;i<3;i++){
try {
System.out.println(name+" say Welcome: "+i);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
调用测试方法,不同线程同时访问synchronized修饰的sayhello()方法和普通方法saywelcome():
final Person person1 = new Person("person1");
Thread thread1 = new Thread(new Runnable() {
@Override
public void