Synchronized的用法
来源:互联网 发布:荷兰语翻译软件 编辑:程序博客网 时间:2024/05/16 19:46
Synchronized java的关键字,目的就是用来修饰某个代码块或是某个方法的时候能保证在同一时间只有一个线程执行该代码。
有以下几种使用场景:
① 当两个并发线程访问同一个对象的synchronized同步代码块时,同一个时间内只能有一个线程执行,另一个线程须等待正在执行的线程执行完该代码块后才能执行;
贴代码
package com.hi.util;public class ThreadTestSynchronized implements Runnable { @Override public void run() { synchronized(this){ for (int i = 1; i <= 5; i++) { System.out.println(Thread.currentThread().getName() +" loop -- "+ i); } System.out.println(" --- ---"); } } public static void main(String[] args) { ThreadTestSynchronized synchronized_ = new ThreadTestSynchronized(); Thread ta = new Thread(synchronized_, "Thread A"); Thread tb = new Thread(synchronized_, "Thread B"); ta.start(); tb.start(); }}
② 当一个线程访问对象的synchronized同步代码块时,另一个线程仍然可以访问该对象的非synchronized同步代码块。
贴代码
package com.hi.util;public class ThreadTestSynchronized2 { public void method_a() { synchronized (this) { int i = 10; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + " -- " + i); } try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public void method_b() { int i = 10; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + " -- " + i); } try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); } } public static void main(String[] args) { final ThreadTestSynchronized2 synchronized2 = new ThreadTestSynchronized2(); Thread ta = new Thread(new Runnable() { public void run() { synchronized2.method_a(); } }, "ta"); Thread tb = new Thread(new Runnable() { public void run() { synchronized2.method_b(); } }, "tb"); ta.start(); tb.start(); }}
③ 当一个线程访问对象的synchronized同步代码块时,该线程就获得了对象锁,其他线程对该对象的所有的synchronized同步代码块将处于阻塞状态,synchronized修饰的方法也同样处于阻塞状态。
贴代码
package com.hi.util;public class ThreadTestSynchronized2 { public void method_a() { synchronized (this) { int i = 5; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + " -- " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public void method_b() { synchronized (this) { int i = 5; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + " -- " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } } public synchronized void method_c() { int i = 5; while (i-- > 0) { System.out.println(Thread.currentThread().getName() + " -- " + i); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { final ThreadTestSynchronized2 synchronized2 = new ThreadTestSynchronized2(); Thread ta = new Thread(new Runnable() { public void run() { synchronized2.method_a(); } }, "ta"); Thread tb = new Thread(new Runnable() { public void run() { synchronized2.method_b(); } }, "tb"); Thread tc = new Thread(new Runnable() { public void run() { synchronized2.method_b(); } }, "tc"); ta.start(); tb.start(); tc.start(); }}
0 0
- synchronized的用法
- synchronized的用法
- synchronized的用法
- synchronized的用法
- synchronized的用法
- synchronized的用法
- synchronized的用法简介
- synchronized的用法
- synchronized的用法汇总
- synchronized关键字的用法
- java的synchronized用法
- synchronized的用法
- @synchronized(self)的用法
- Synchronized的用法
- 【转载】synchronized的用法
- synchronized关键字的用法
- Java-synchronized的用法
- synchronized的用法
- springMVC文件上传下载-实例1
- Objective-C:一些要注意的细节
- 如何定位Android NDK开发中遇到的错误
- Android开源SlidingMenu的使用
- 非常好的遗传算法例子
- Synchronized的用法
- 修改MySQL数据存放目录
- 数据库记录
- Linux软链接和硬链接
- NGINX 图片服务器
- 如何对双卡手机的通话记录的数据添加
- OpenGL红宝书学习笔记(1)
- 查询结果集直接更新到同一张表中的某个字段
- jvm serializer 功能&性能基准测试