Synchronized 关键字
沈阳市和平区爱尚职业培训机构
发表于:2018-06-27 15:39:17在爱尚沈阳java培训学习java编程中,经常需要用到同步,而用得多的也许是synchronized关键字了,下面爱尚沈阳java培训老师带你看看这个关键字的用法。
synchronized只是一个内置锁的加锁机制,当某个方法加上synchronized关键字后,就表明要获得该内置锁才能执行,并不能阻止其他线程访问不需要获得该内置锁的方法。
把synchronized当作函数修饰符时,示例代码如下:
Public synchronized void method(){
//….
}
这也就是同步方法,那这时synchronized锁定的是哪个对象呢?他锁定的是调用这个同步方法对象。也就是说,当一个对象P1在不同的线程中执行这个同步方法时,他们之间会形成互斥,达到同步的效果。但是这个对象所属的Class所产生的另一对象P2却能够任意调用这个被加了synchronized关键字的方法。下面就和爱尚沈阳java培训的老师看看到底要怎么用用吧。
上边的示例代码等同于如下代码:
public void method()
{
synchronized (this) // (1)
{
//…..
}
}
(1)处的this指的是什么呢?他指的就是调用这个方法的对象,如P1。可见同步方法实质是将synchronized作用于object reference。――那个拿到了P1对象锁的线程,才能够调用P1的同步方法,而对P2而言,P1这个锁和他毫不相干,程式也可能在这种情形下摆脱同步机制的控制,造成数据混乱。
区分 synchronized (this) 与 synchronized (Class.class)
public class Test {
private static class Counter {
public void count() {
synchronized (this){
System.out.println(Thread.currentThread().getName() + " sleep");
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName() + " awake");
}
}
public void doOtherThings(){
synchronized (Counter.class){
System.out.println(Thread.currentThread().getName() + " doOtherThings");
}
}
}
public static void main(String[] var0) {
final Counter counter = new Counter();
new Thread(new Runnable() {
@Override
public void run() {
counter.count();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
counter.doOtherThings();
}
}).start();
}
}
Synchronized 关键字 原创内容,请点击沈阳软件开发培训
热门课程
-
沈阳软件开发零基础培训班
询价
-
Python全栈培训课程
询价
-
沈阳Python零基础就业培训班
询价
-
沈阳爱尚web前端培训课程
询价
-
沈阳大数据零基础培训课程
询价