2014年1月10日星期五

Java多线程系列--“基础篇”04之 synchronized关键字 - 如果天空不死

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Java多线程系列--"基础篇"04之 synchronized关键字 - 如果天空不死  阅读原文»

概要

本章,会对synchronized关键字进行介绍。涉及到的内容包括:
1. synchronized原理
2. synchronized基本规则
3. synchronized方法 和 synchronized代码块
4. 实例锁 和 全局锁

转载请注明出处:http://www.cnblogs.com/skywang12345/p/3479202.html

1. synchronized原理

在java中,每一个对象有且仅有一个同步锁。这也意味着,同步锁是依赖于对象而存在。
当我们调用某对象的synchronized方法时,就获取了该对象的同步锁。例如,synchronized(obj)就获取了“obj这个对象”的同步锁。
不同线程对同步锁的访问是互斥的。也就是说,某时间点,对象的同步锁只能被一个线程获取到!通过同步锁,我们就能在多线程中,实现对“对象/方法”的互斥访问。 例如,现在有两个线程A和线程B,它们都会访问“对象obj的同步锁”。假设,在某一时刻,线程A获取到“obj的同步锁”并在执行一些操作;而此时,线程B也企图获取“obj的同步锁” —— 线程B会获取失败,它必须等待,直到线程A释放了“该对象的同步锁”之后线程B才能获取到“obj的同步锁”从而才可以运行。

2. synchronized基本规则

我们将synchronized的基本规则总结为下面3条,并通过实例对它们进行说明。
第一条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。
第二条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程仍然可以访问“该对象”的非同步代码块
第三条: 当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的其他的“synchronized方法”或者“synchronized代码块”的访问将被阻塞。

第一条

当一个线程访问“某对象”的“synchronized方法”或者“synchronized代码块”时,其他线程对“该对象”的该“synchronized方法”或者“synchronized代码块”的访问将被阻塞。
下面是“synchronized代码块”对应的演示程序。

1 class MyRunable implements Runnable {
2
3 @Override
4 public void run() {
5 synchronized(this) {
6 try {
7 for (int i = 0; i < 5; i++) {
8 Thread.sleep(100); // 休眠100ms
9 System.out.println(Thread.currentThread().getName() + " loop " + i);
10 }
11 } catch (InterruptedException ie) {
12 }
13 }
14 }
15 }
16
17 public class Demo1_1 {
18
19 public static void main(String[] args) {
20 Runnable demo = new MyRunable(); // 新建“Runnable对象”
21
22 Thread t1 = new Thread(demo, "t1"); // 新建“线程t1”, t1是基于demo这个Runnable对象
23 Thread t2 = new Thread(demo, "t2"); // 新建“线程t2”, t2是基于demo这个Runnable对象
24 t1.start(); // 启动“线程t1”
25 t2.start(); // 启动“线程t2”
26 }
27 }

运行结果

t1 loop 0
t1 loop
1
t1 loop
2
t1 loop
3
t1 loop
4
t2 loop
0
t2 loop
1
t2 loop
2
t2 loop
3
t2 loop
4

结果说明
run()方法中存在“synchronized(this)代码块”,而且t1和t2都是基于"demo这个Runnable对象"创建的线程。这就意味着,我们可以将synchronized(this)中的this看作是“demo这个Runnable对象”;因此,线程t1和t2共享“demo对象的同步锁”。所以,当一个线程运行的时候,另外一个线程必须等待“运行线程”释放“demo的同步锁”之后才能运行。

如果你确认,你搞清楚这个问题了。那我们将上面的代码进行修改,然后再运行看看结果怎么样,看看你是否会迷糊。修改后的源码如下:

1 class MyThread extends Thread {
2
3 public MyThread(String name) {
4 super(name);
5 }
6
7
年薪六十万,你还缺些什么?(续) - wikstone  阅读原文»

前天下午发的文章,没想到引起这么大的反响,昨天下午上线,一看没想到当事人都出来了,错过了直播,看着评论马上就要透露当事人的公司地址及其他相关信息,忍痛删掉,大家可以继续来喷,我发的信息呢大部分是领导层面说的,也只是分享下信息(对事不对人的),让众程序猿们加把劲,拿个更高的年薪,没想到当事人中的员工竟然起了这么大的煽动作用,首先问几句1、你们的老板为什么不信任你们,找第三方机构评估2、你们为什么不能更清楚的让你们领导知道你们正在做什么?人不犯我,我不犯人;人若犯我,礼让三分;人再犯我,我还一针;人还犯我,斩草除根。


本文链接:http://www.cnblogs.com/WikStone/p/3514707.html,转载请注明。

阅读更多内容

没有评论:

发表评论