简介
多个线程,每个线程都可以拿到自己指定的锁,分别获取锁之后,执行ysnchronized方法体的内容。
代码
public class Demo2 {private static int num = 0;
/*static*/
public synchronized void prinNum (String tag) {
try {
if (tag.equals("a")) {
num = 100;
System.out.println("tag a, set num over!");
Thread.sleep(1000);
} else {
num = 200;
System.out.println("tag b, set num over!");
}
System.out.println("tag " + tag + ", num = " + num);
} catch (Exception e) {
e.printStackTrace();
}
}
// 注意观察run方法输出顺序
public static void main(String[] args) {
// 俩个不同的对象
final Demo2 d1 = new Demo2();
final Demo2 d2 = new Demo2();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
d1.prinNum("a");
}
});
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
d2.prinNum("b");
}
});
t1.start();
t2.start();
}
}
效果:图1
在printNum方法上加上static,public synchronized static void prinNum (String tag) {...}:图2
分析说明
关键字synchronized取得的锁都是对象锁,而不是把一段代码(方法)当做锁,所以上述代码中哪个线程先执行synchronized关键字的方法,哪个线程就持有该方法所属对象的锁(Lock),两个对象,线程获得的就是两个不同的锁,他们互不影响。
有一种情况则是相同的锁,即在静态方法上加synchronized关键字,表示锁定.class类,类一级别的锁(独占.class类)
同步:synchronized
同步的概念就是共享,我们要牢牢记住“共享”这两个字,如果不是共享的资源,就没有必要进行同步。
异步:asynchronized
异步的概念就是独立,相互之间不受到任何制约。就好像我们学习http的时候,在页面发起的Ajax请求,我们还可以继续浏览或操作页面的内容,二者之间没有任何关系
同步的目的就是为了线程安全,其实对于线程安全来说,需要满足俩个特性:
原子性(同步)
可见性
本文出自 “我爱大金子” 博客,请务必保留此出处http://1754966750.blog.51cto.com/7455444/1902798