项目需要处理并发的情况,考虑用同步锁,防止数据影响.
从而请出今天的主角,synchronized关键字
synchronized这个关键字其实一直没有研究懂,看到过别人使用,有人用它修饰方法名,也有用修饰代码块的,还有用
修饰静态方法的.修饰方法不需要括号,但是修饰代码块需要括号,这个括号中有很多的方式.希望通过这篇文章,把它
能够理解的明白些.synchronized,英文含义为同步,同时进行.本人理解为在同时来访问一个方法时,锁定这个方法.
- 从简单的开始,用synchronized 对同一个实例进行同步锁定,把它用在哪里都可以锁住.
public class SynchronizedTest implements Runnable {
private Object MUTEX = new Object();
public static void main(String[] args) {
SynchronizedTest synchronizedTest = new SynchronizedTest();
for (int i = 0; i < 10; i++) {
new Thread(synchronizedTest).start();
}
}
@Override
public void run() {
test();
}
private void test() {
synchronized (this) {
System.out.println("ThreadName = " + Thread.currentThread().getName() + ",stamp = " + System.currentTimeMillis());
try {
TimeUnit.SECONDS.sleep(1L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}上述例子对SynchronizedTest的一个实例进行多线访问,synchronized关键字访问任何想控制的地方都可以,synchronized 修饰代码块,可以使用this, SynchronizedTest.class,MUTEX,都可以实现一样的效果,都能把代码锁住,不过建议使用synchronized(this).synchronized(this)修饰代码块功能和在类中定义一个成员来锁定,我认为是一个作用.
输出结果

能够看见,按照预期的结果进行输出.
- synchronized ,用它来修饰类方法,能够保证SynchronizedTest这个类在多实例的情况下,也能进行同步锁定
public class SynchronizedTest implements Runnable {
private Object MUTEX = new Object();
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
SynchronizedTest synchronizedTest = new SynchronizedTest();
new Thread(synchronizedTest).start();
}
}
@Override
public void run() {
test();
}
private synchronized static void test() {
System.out.println("ThreadName = " + Thread.currentThread().getName() + ",stamp = " + System.currentTimeMillis());
try {
TimeUnit.SECONDS.sleep(1L);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}用 synchronized (SynchronizedTest.class)来修饰代码块,也能起到相同的作用.

综上所述,要看是类的同步锁定,还是同一个实例的同步锁定.
synchronized (SynchronizedTest.class),这个方法是针对类和实例,保证同时只有一个能访问方法块.
针对类的实例的锁,不对类锁,可以通过synchronized(this),synchronized(MUTEX),或者synchronized来修饰方法.
主要看其限制范围来使用它,所以要选择进行对待,不要为了使用而使用.