java的多线程同步及锁的机制 http://f.dataguru.cn/thread-483280-1-1.html (出处: 炼数成金)
来源:互联网 发布:塔里木农垦大学知乎 编辑:程序博客网 时间:2024/05/21 13:44
java多线程的同步依靠的是对象锁机制,synchronized关键字的背后就是利用了封锁来实现对共享资源的互斥访问。
下面以一个简单的实例来进行对比分析。实例要完成的工作非常简单,就是创建10个线程,每个线程都打印从0到99这100个数字,我们希望线程之间不会出现交叉乱序打印,而是顺序地打印。
先来看第一段代码,这里我们在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,但结果并不如我们希望那样,这是因为这里synchronized锁住的是this对象,即当前运行线程对象本身。代码中创建了10个线程,而每个线程都持有this对象的对象锁,这不能实现线程的同步。
Java代码 [url=][/url]
Java代码 [url=][/url]
从第二段代码可知,同步的关键是多个线程对象竞争同一个共享资源即可,上面的代码中是通过外部创建共享资源,然后传递到线程中来实现。我们也可以利用类成员变量被所有类的实例所共享这一特性,因此可以将lock用静态成员对象来实现,代码如下所示:
Java代码 [url=][/url]
Java代码 [url=][/url]
再来看第一段代码,实例方法中加入sychronized关键字封锁的是this对象本身,而在静态方法中加入sychronized关键字封锁的就是类本身。静态方法是所有类实例对象所共享的,因此线程对象在访问此静态方法时是互斥访问的,从而可以实现线程的同步,代码如下所示:
Java代码 [url=][/url]
下面以一个简单的实例来进行对比分析。实例要完成的工作非常简单,就是创建10个线程,每个线程都打印从0到99这100个数字,我们希望线程之间不会出现交叉乱序打印,而是顺序地打印。
先来看第一段代码,这里我们在run()方法中加入了synchronized关键字,希望能对run方法进行互斥访问,但结果并不如我们希望那样,这是因为这里synchronized锁住的是this对象,即当前运行线程对象本身。代码中创建了10个线程,而每个线程都持有this对象的对象锁,这不能实现线程的同步。
Java代码 [url=][/url]
- package thread;
- public class MyThread implements Runnable{
- private int threadId;
- public MyThread(int id) {
- this.threadId = id;
- }
- @Override
- public synchronized void run() {
- for(int i=0; i<100; i++) {
- System.out.println("Thread ID: " + this.threadId + " : " + i);
- }
- }
- }
Java代码 [url=][/url]
- package thread;
- public class ThreadDemo {
- public static void main(String[] args) throws InterruptedException {
- for(int i=0; i<10; i++) {
- new Thread(new MyThread(i)).start();
- Thread.sleep(1);
- }
- }
- }
从第二段代码可知,同步的关键是多个线程对象竞争同一个共享资源即可,上面的代码中是通过外部创建共享资源,然后传递到线程中来实现。我们也可以利用类成员变量被所有类的实例所共享这一特性,因此可以将lock用静态成员对象来实现,代码如下所示:
Java代码 [url=][/url]
- package thread;
- public class MyThread implements Runnable{
- private int threadId;
- private static Object lock = new Object();
- public MyThread(int id) {
- this.threadId = id;
- }
- @Override
- public void run() {
- synchronized(lock) {
- for(int i=0; i<100; i++) {
- System.out.println("Thread ID: " + this.threadId + " : " + i);
- }
- }
- }
- }
Java代码 [url=][/url]
- package thread;
- public class ThreadDemo {
- public static void main(String[] args) throws InterruptedException {
- for(int i=0; i<10; i++) {
- new Thread(new MyThread(i)).start();
- Thread.sleep(1);
- }
- }
- }
再来看第一段代码,实例方法中加入sychronized关键字封锁的是this对象本身,而在静态方法中加入sychronized关键字封锁的就是类本身。静态方法是所有类实例对象所共享的,因此线程对象在访问此静态方法时是互斥访问的,从而可以实现线程的同步,代码如下所示:
Java代码 [url=][/url]
- package thread;
- public class MyThread implements Runnable {
- private int threadId;
- public MyThread(int id) {
- this.threadId = id;
- }
- @Override
- public void run() {
- taskHandler(this.threadId);
- }
- private static synchronized void taskHandler(int threadId) {
- for (int i = 0; i < 100; ++i) {
- System.out.println("Thread ID: " + threadId + " : " + i);
- }
- }
- }
0 0
- java的多线程同步及锁的机制 http://f.dataguru.cn/thread-483280-1-1.html (出处: 炼数成金)
- R链接到数据库(http://www.dataguru.cn/thread-289411-1-1.html)
- http://www.dataguru.cn/article-1602-1.html
- 整理牛人看文献的方法 http://bbs.sciencenet.cn/thread-523775-1-1.html
- http://tech.techweb.com.cn/thread-331053-1-1.html
- http://bbs.anzhuo.cn/thread-982250-1-1.html
- http://www.aqinet.cn/thread-585-1-1.html
- http://www.arduino.cn/thread-6690-1-1.html
- http://koolshare.cn/thread-49179-1-1.html
- 推荐一个VS2010下的智能联想插件,比IntellSense更给力! http://bbs.itheima.com/thread-53922-1-1.html (出处: 黑马程序员IT技术论坛)
- Java多线程的同步机制
- Java多线程的同步机制
- java多线程的同步机制
- 被占用文件操作三法 (出处 http://club.topsage.com/thread-2224967-1-1.html)
- java多线程Thread线程同步与互斥、锁机制
- 彻底解决联想手机数据连接不能上网问题(无需恢复出厂设置) 本文来自移动叔叔论坛 ,详细出处请参考:http://bbs.ydss.cn/thread-201115-1-1.html
- 怎样使用C语言程序获取Linux系统中未使用的内存大小? http://linux.cn/thread-13774-1-1.html
- http://bbs.winos.cn/thread-110055-9-1.html
- Mysql数据库事务的隔离级别和锁的实现原理分析
- 添加VLC录像API
- HDU 4883 TIANKENG’s restaurant(排序或优先队列模拟)——BestCoder Round #2
- ASP.NET第一章总结
- UIWebView与JS的深度交互
- java的多线程同步及锁的机制 http://f.dataguru.cn/thread-483280-1-1.html (出处: 炼数成金)
- Codeforces Round #315 (Div. 1)
- TextView加载Html内容(自定义TextView)
- 微信公众号开发系列-网页授权获取用户基本信息
- Linux 下 安装 PHP 的 PDO_MYSQL 扩展
- LOJ 1201 - A Perfect Murder(二分匹配 最大独立集)
- IOS项目上架时问题的解决方案(3)
- android-ndk 数据传递
- 解决点击状态栏时ScrollView自动滚动到初始位置失效办法