Java synchronized详解
来源:互联网 发布:云杉网络 张天鹏 编辑:程序博客网 时间:2024/06/08 16:25
原文链接
原文链接:http://www.cnblogs.com/GnagWang/archive/2011/02/27/1966606.html
前言
android学的迷迷糊糊的,跟师兄请了个假,下午想看会书,这里转载一篇讲java synchronized的文章。
synchronized
java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程在执行该段代码:
- 当两个并发线程访问同一对象object中的这个synchronized(this)同步代码块时,一个时间内只能有一个线程得到执行,另一个线程必须等待当前线程执行玩这个代码块以后才能执行该代码块;
- 然而,当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object中的非synchronized(this)同步代码块;
- 尤其关键的是,当一个线程访问object的一个synchronized(this)同步代码块时,它就获得了这个object的对象锁,其他线程对object中所有其它synchronized(this)同步代码块的访问将被阻塞;
- 以上规则对其它对象锁同样适用。
举例说明
1. 当两个并发线程访问同一个对象object中的这个synchronized(this)同步代码时,一个时间内只能有一个线程得到执行,另一个线程必须等待当前线程执行完这个代码块以后才能执行该代码块
public class TestSync implements Runnable { @Override public void run() { synchronized (this) { for (int i = 0; i < 5; i++) { System.out.println(Thread.currentThread().getName() + "synchronized loop" + i); } } } public static void main(String[] args) { TestSync t1 = new TestSync(); Thread t2 = new Thread(t1, "A"); Thread t3 = new Thread(t1, "B"); t2.start(); t3.start(); }}
2. 当一个线程访问object的一个synchronized(this)同步代码块时,另一个线程仍然可以访问该object的非synchronized(this)同步代码块
public class TestSync { public void m4t1() { synchronized(this) { int i = 5; while (i -- > 0) { System.out.println(Thread.currentThread().getName() + ":" + i); try { Thread.sleep(500); } catch(InterruptedException is) { is.printStackTrace(); } } } } public void m4t2() { int i = 5; while (i -- > 0) { System.out.println(Thread.currentThread().getName() + ":" + i); try { Thread.sleep(500); } catch(InterruptedException is) { is.printStackTrace(); } } } public static void main(String[] args) { final TestSync myt2 = new TestSync(); new Thread(new Runnable() { @Override public void run() { myt2.m4t1(); } }, "t1 ").start(); new Thread(new Runnable() { @Override public void run() { myt2.m4t2(); } }, "t2 ").start(); }}
3. 当一个线程访问object的一个synchronized(this)同步代码块时,它就获得这个object对象锁,其他线程对object中所有其它synchronized(this)同步代码块的访问被阻塞
package learn;public class TestSync { public void m4t1() { synchronized(this) { int i = 5; while (i -- > 0) { System.out.println(Thread.currentThread().getName() + ":" + i); try { Thread.sleep(500); } catch(InterruptedException is) { is.printStackTrace(); } } } } public synchronized void m4t2() { int i = 5; while (i -- > 0) { System.out.println(Thread.currentThread().getName() + ":" + i); try { Thread.sleep(500); } catch(InterruptedException is) { is.printStackTrace(); } } } public static void main(String[] args) { final TestSync myt2 = new TestSync(); new Thread(new Runnable() { @Override public void run() { myt2.m4t1(); } }, "t1 ").start(); new Thread(new Runnable() { @Override public void run() { myt2.m4t2(); } }, "t2 ").start(); }}
0 0
- java synchronized详解--synchronized方法
- java synchronized详解java synchronized详解
- [Java] Java synchronized详解
- java synchronized详解
- java synchronized详解
- java synchronized详解
- java synchronized详解(一)
- java synchronized详解(二)
- java synchronized详解
- java synchronized详解
- java synchronized详解
- java synchronized详解
- java synchronized详解
- java synchronized详解
- java synchronized详解
- java synchronized详解
- java synchronized详解
- java synchronized详解
- 考数据库系统会用到的一些计算方法和题目整理(1)
- Linux Input子系统之第一篇(input_dev/input_handle/input_handler)
- Windows系统配置PHP+Apache
- 【OpenGL游戏开发之五】freetype2 显示汉字
- ubuntu下hello world kernel Module:MODPOST 0 modules
- Java synchronized详解
- linux下杀死进程全权讲解
- ECM EMM
- ubuntu安装使用笔记06——maven安装配置
- Linux Input子系统第二篇之A/B(Slot)协议
- 什么是BIOS?如何进入BIOS设置(含各种品牌电脑)
- 无法解析或打开软件包的列表或是状态文件解决方案
- CentOS下安装中文输入法
- nginx缓存设置