线程同步
来源:互联网 发布:买卖点炒股软件 编辑:程序博客网 时间:2024/06/13 21:34
1、什么是线程同步和异步?
线程同步:即当有一个线程在对内存进行操作时,其他线程都不可以对这个内存地址进行操作,直到该线程完成操作, 其他线程才能对该内存地址进行操作,而其他线程又处于等待状态。
在Java中可以看成,多个线程操作同一个对象或执行同一个代码块时,必须排队,必须等上一个线程操作完下一个线程再操作。
线程异步:多个线程可以同时操作同一个对象或执行同一个代码块。
2、synchronized关键字实现线程同步
每个对象只能同时与一个线程加锁。
一个线程可以对同一个对象多次加锁。
- 线程访问使用synchronized修饰一个对象、对象中的方法或对象中的代码块时,必须获得该对象的对象锁。
- 当线程A与对象1加锁时,若A没释放对象1的锁,线程B无法与对象1加锁,无法访问synchronized修饰的内容。
- 当对象1既有synchronized代码块也有非synchronized代码块时,其它线程可以异步访问非synchronized代码块。
- 一个对象只能与同时与一个线程加锁,所以当一个对象有两个synchronized方法,线程A访问synchronized方法1时,线程B无法访问synchronized方法2。
public class MyThread implements Runnable{ /**修饰方法1**/ public synchronized void fangfa1() throws Exception{ System.out.println("fangfa1"); Thread.sleep(5000); } /**修饰方法2**/ public synchronized void fangfa2() throws Exception{ System.out.println("fangfa2"); } @Override public void run(){ try{ fangfa1(); }catch(Exception e){ e.printStackTrace(); } }/**************主线程****************************/public static void main(String[] args) throws Exception{ MyThread mythread = new MyThread(); Thread thread = new Thread(mythread); thread.start(); Thread.sleep(1000);//此处休眠一秒是为了让子线程先执行,否则CPU会随机执行子线程或主线程 mythread.fangfa2();}}
输出结果
fangfa1
/*等待六秒/
fangfa2
子线程开启后访问fangfa1,然后休眠5秒,休眠过程中子线程持有对象锁,所以主线程无法对象锁,无法访问同步的fangfa2,五秒后子线程释放对象锁,此时主线程持对象锁访问fangfa2。 如果fangfa2去掉synchronized ,则主线程会异步访问fangfa2。
0 0
- 线程同步--线程同步--线程同步--线程同步--线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- 线程同步
- Kafka介绍翻译
- 径向基神经网络及MATLAB实现
- LeetCode 130 Surrounded Regions(并查集)
- 漫谈千亿级数据优化实践:数据倾斜
- poj2441(状压dp)
- 线程同步
- 面试题39:二叉树的深度
- 常用的计算宽高的方法
- markdown
- WAMP服务器远程外部访问配置
- webmagic学习笔记(2)---m2e插件的安装
- 逆向工程核心原理学习笔记(十二):分析abex' crackme #1
- 《C++ Primer》第7章:类
- CSUOJ 1891 Full Tank? 有约束条件下的最短路 分支限界法?