java线程&&并发-实践笔记
来源:互联网 发布:dbc2000 传奇数据库表 编辑:程序博客网 时间:2024/06/18 08:56
好文链接:
深入理解java内存模型系列文章
评论相当精彩:java中volatile关键字的含义
同步块执行顺序
调用方法如下:
for (int i = 0; i < 5; i++) { final int index = i; new Thread(new Runnable() { @Override public void run() { if (index == 0) {//第一个线程执行methodB,其他的线程执行methodA CldSyncUtil.methodB(); } else { CldSyncUtil.methodA(); } } }).start(); }
public class CldSyncUtil { public static void methodA() {//都不加锁 Log.i("clp", "methodA"); } public static void methodB() {//都不加锁 Log.i("clp", "method B start"); try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } Log.i("clp", "method B end"); }}
05-09 08:44:57.209 5553-5632/com.example.demo I/clp: methodA05-09 08:44:57.209 5553-5633/com.example.demo I/clp: methodA05-09 08:44:57.209 5553-5631/com.example.demo I/clp: methodA05-09 08:44:57.209 5553-5630/com.example.demo I/clp: method B start05-09 08:44:57.209 5553-5634/com.example.demo I/clp: methodA05-09 08:45:02.209 5553-5630/com.example.demo I/clp: method B end
RE:随意执行,线程之间互相不影响。
在methodB方法体中增加同步方法synchronized
public class CldSyncUtil { public static void methodA() {//不加锁 Log.i("clp", "methodA"); } public static synchronized void methodB() {//加锁 Log.i("clp", "method B start"); try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } Log.i("clp", "method B end"); }}
05-09 08:48:13.899 5553-9553/com.example.demo I/clp: method B start05-09 08:48:13.909 5553-9554/com.example.demo I/clp: methodA05-09 08:48:13.909 5553-9556/com.example.demo I/clp: methodA05-09 08:48:13.909 5553-9555/com.example.demo I/clp: methodA05-09 08:48:13.909 5553-9557/com.example.demo I/clp: methodA05-09 08:48:18.899 5553-9553/com.example.demo I/clp: method B end
methodB加锁,并不会影响methodA的执行。
给methodA方法也加上锁。
public class CldSyncUtil { public static synchronized void methodA() {//加锁 Log.i("clp", "methodA"); } public static synchronized void methodB() {//加锁 Log.i("clp", "method B start"); try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } Log.i("clp", "method B end"); }}
05-09 08:49:14.389 10801-10870/com.example.demo I/clp: method B start05-09 08:49:19.389 10801-10870/com.example.demo I/clp: method B end05-09 08:49:19.389 10801-10871/com.example.demo I/clp: methodA05-09 08:49:19.389 10801-10873/com.example.demo I/clp: methodA05-09 08:49:19.389 10801-10874/com.example.demo I/clp: methodA05-09 08:49:19.389 10801-10872/com.example.demo I/clp: methodA
后面的线程会等到第一个线程执行完,才能执行。
同步的时候访问同一个变量
同步的意思是多个线程之间不能同时访问同步块中的代码,但是里面引用的变量等还是可以访问的。
public class CldSyncUtil { public static int num = 0; public static void methodA() {//都不加锁 Log.i("clp", "methodA=" + num); } public static synchronized void methodB() {//都不加锁 Log.i("clp", "method B start"); num++; try { Thread.sleep(5000); } catch (Exception e) { e.printStackTrace(); } Log.i("clp", "method B end"); }}
for (int i = 0; i < 5; i++) { final int index = i; new Thread(new Runnable() { @Override public void run() { if (index == 0) {//第一个线程执行methodB,其他的线程执行methodA CldSyncUtil.methodB(); } else { CldSyncUtil.methodA(); } try { Thread.sleep(200); } catch (Exception e) { e.printStackTrace(); } } }).start(); }
05-09 09:01:36.049 24673-24728/com.example.demo I/clp: method B start05-09 09:01:36.049 24673-24731/com.example.demo I/clp: methodA=105-09 09:01:36.059 24673-24730/com.example.demo I/clp: methodA=105-09 09:01:36.059 24673-24732/com.example.demo I/clp: methodA=105-09 09:01:41.049 24673-24728/com.example.demo I/clp: method B end05-09 09:01:41.049 24673-24729/com.example.demo I/clp: methodA=1
RE:在执行method B的时候,可以同时访问method A中使用的变量num
0 0
- java线程&&并发-实践笔记
- 编程实践笔记{Java 线程 并发处理 Webservice}
- Java并发编程实践笔记之-什么是线程安全
- Java并发编程实践笔记之—线程
- java线程并发笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- java并发编程实践笔记
- MFC——基本概念的通俗理解1
- mediacodec mp4v2应用
- iOS性能优化:Instruments使用实战
- Rxjava与Rxandroid结合实现网络请求
- 【Android】不同的View引起软键盘无法关闭问题解决方案
- java线程&&并发-实践笔记
- JNDI详细配置及使用
- 又一段旅程
- bitmap 图像压缩方法
- 575. Distribute Candies
- Error: Cannot retrieve metalink for repository: epel. Please verify its path and try again
- Android mdpi hdpi xdpi
- K-means聚类算法
- js对象的深拷贝和浅拷贝