例1 - synchronized和volatile


package volatileTest;public class VolatileTest01 {volatile int i;// synchronized if commented out, sum will not equal to 1000// synchronized 注释了synchronized,即使加上volatile也得不到1000的结果public void  addI(){i++;}public static void main(String[] args) throws InterruptedException {final  VolatileTest01 test01 = new VolatileTest01();for (int n = 0; n < 1000; n++) {new Thread(new Runnable() {@Overridepublic void run() {try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}test01.addI();}}).start();}Thread.sleep(10000);//等待10秒,保证上面程序执行完成System.out.println(test01.i);}
}

缓存一致性协议——Intel 的MESI协议,保证了每个缓存中使用的共享变量的副本是一致的。它核心的思想是:当CPU写数据时,如果发现操作的变量是共享变量,即在其他CPU中也存在该变量的副本,会发出信号通知其他CPU将该变量的缓存行置为无效状态,因此当其他CPU需要读取这个变量时,发现自己缓存中缓存该变量的缓存行是无效的,那么它就会从内存重新读取。

例2 - CountDownLatch

package threadTest2;import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class ThreadPoolTest {private static final int COUNT = 10;// 每一个线程减一次1private static class TestRunnable implements Runnable {private final CountDownLatch countDownLatch;private byte[] lock;TestRunnable(CountDownLatch countDownLatch, byte[] byteArray) {this.countDownLatch = countDownLatch;this.lock = byteArray;}@Overridepublic void run() {synchronized(this.lock) {System.out.println("Thread id: " + Thread.currentThread().getId());countDownLatch.countDown();System.out.println("Left number: " + countDownLatch.getCount());if( countDownLatch.getCount() == 0){System.out.println("!!!!!!!!!! Game over!!!!!!!!!!!");}}}}public void testThreadPool() throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(COUNT);ExecutorService executorService = Executors.newFixedThreadPool(10);long bg = System.currentTimeMillis();final byte[] lock = new byte[0];  // 特殊的instance变量for (int i = 0; i < COUNT; i++) {Runnable command = new TestRunnable(countDownLatch, lock);executorService.execute(command);}countDownLatch.await();System.out.println("testThreadPool:"+ (System.currentTimeMillis() - bg));}public void testNewThread() throws InterruptedException {CountDownLatch countDownLatch = new CountDownLatch(COUNT);long bg = System.currentTimeMillis();final byte[] lock = new byte[0];  // 特殊的instance变量for (int i = 0; i < COUNT; i++) {Runnable command = new TestRunnable(countDownLatch, lock);Thread thread = new Thread(command);thread.start();}countDownLatch.await();System.out.println("testNewThread:" + (System.currentTimeMillis() - bg));}public static void main(String[] arg) {ThreadPoolTest a = new ThreadPoolTest();try {// a.testThreadPool();a.testNewThread();} catch (InterruptedException e) {e.printStackTrace();}}
}

输出:

Thread id: 13
Left number: 9
Thread id: 22
Left number: 8
Thread id: 21
Left number: 7
Thread id: 20
Left number: 6
Thread id: 19
Left number: 5
Thread id: 17
Left number: 4
Thread id: 16
Left number: 3
Thread id: 18
Left number: 2
Thread id: 15
Left number: 1
Thread id: 14
Left number: 0
testNewThread:8
!!! Game over!!!

例3 - 一个死锁的例子

package thread;public class DeadLockExample {public static void main(String[] args) {final String resource1 = "ABAP";final String resource2 = "Java";// t1 tries to lock resource1 then resource2Thread t1 = new Thread() {public void run() {synchronized (resource1) {System.out.println("Thread 1: locked resource 1");try {Thread.sleep(100);} catch (Exception e) {}synchronized (resource2) {System.out.println("Thread 1: locked resource 2");}}}};Thread t2 = new Thread() {public void run() {synchronized (resource2) {System.out.println("Thread 2: locked resource 2");try {Thread.sleep(100);} catch (Exception e) {}synchronized (resource1) {System.out.println("Thread 2: locked resource 1");}}}};t1.start();t2.start();}
}

Java线程同步的一些例子相关推荐

  1. java线程同步例子_JAVA线程同步实例教程

    线程是Java程序设计里非常重要的概念,本文就以实例形式对此加以详细解读.具体分析如下: 首先,线程加锁有什么用处呢?举个例子:比如你现在有30000块大洋在银行存着,现在你到银行取钱,当你输入密码完 ...

  2. java线程 同步与异步 线程池

    1)多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线 程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有时为了解 决此问题,优先考虑 ...

  3. 关于java线程同步的笔记_线程同步(JAVA笔记-线程基础篇)

    在多线程应用程序中经常会遇到线程同步的问题.比如:两个线程A.线程B可能会 "同时" 执行同一段代码,或修改同一个变量.而很多时候我们是不希望这样的. 这时候,就需要用到线程同步. ...

  4. Java --- 线程同步和异步的区别

    1. Java 线程 同步与异步 多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线程的处理的数据,而B线程又修改了A线程处理的数理.显然这是由于全局资源造成的,有 ...

  5. Java线程--同步和异步的区别

    本文转自https://blog.csdn.net/u011033906/article/details/53840525 1. Java 线程 同步与异步 多线程并发时,多个线程同时请求同一个资源, ...

  6. (转) Java线程同步阻塞, sleep(), suspend(), resume(), yield(), wait(), notify()

    为了解决对共享存储区的访问冲突,Java 引入了同步机制.但显然不够,因为在任意时刻所要求的资源不一定已经准备好了被访问,反过来,同一时刻准备好了的资源也可能不止一个. 为解决访问控制问题,Java ...

  7. java线程同步——条件对象+synchronized 关键字

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--条件对象+synchronized 关键字 的相关知识: 0.2)for ...

  8. java线程同步——竞争条件的荔枝+锁对象

    [0]README 0.1) 本文描述转自 core java volume 1, 源代码为原创,旨在理解 java线程同步--竞争条件的荔枝+锁对象 的相关知识: 0.2) for full sou ...

  9. Java线程同步-模拟买票

    文章首发于 2020-11-29 知乎文章:Java线程同步-模拟买票 作者:落雨湿红尘(也是我o) 01 导语 本文使用JAVA代码模拟买票场景下的业务交互,通过示例讲解线程的初始化.线程同步等ja ...

最新文章

  1. ECSHOP 数据库结构说明
  2. mysql数据库连接jar_mysql数据库连接包
  3. 在java中使用base64加密解密的方法
  4. linux下c语言tcp文件传输,C语言实现TCP通信
  5. 网络安全应急演练方案内容_筑牢网络安全屏障 盐田区开展网络安全应急演练...
  6. 2017.9.6数学
  7. CAN笔记(8) 优先级
  8. Mysql学习总结(15)——Mysql错误码大全
  9. 饿了么想解决外卖小哥马路杀手的问题,但用无人机?
  10. 高通MSM8953 Android7.1蓝牙接电话流程(App到Adsp)(十六)
  11. Android内容提供者(Content provider)
  12. ocr小白入门CRNN
  13. 商用密码产品认证-IPSec/SSL网关技术与产品
  14. 巴别时代php面试题,巴别时代遇到的函数
  15. 微信小程序云函数NodeJs如何等待两次异步操作后返回数据给前端
  16. android画机器人,cdr怎么绘制安卓小人?cdr安卓机器人制作教程
  17. linux v4l2系统详解,Linux摄像头驱动学习之:(一)V4L2_框架分析
  18. 日期函数months_between的用法
  19. jenkins网页打不开问题解决方法
  20. Python 实现中国地图可视化

热门文章

  1. MySQL8.0.16主从同步
  2. 将图片序列化和反序列化
  3. Android菜鸟的成长笔记(28)——Google官方对Andoird 2.x提供的ActionBar支持
  4. 设置UITextField占位符的颜色和字体
  5. linux 编译 freescale arm 的gdb server
  6. WCF服务开发与调用的完整示例
  7. C++ dlopen mini HOWTO 一篇非常好的介绍C++ dlopen linux/mac os x 编程的资料
  8. maven-surefire-plugin 自动化单元测试插件
  9. sklearn自学指南(part59)--神经网络模型(监督)
  10. CSS基础(part11)--盒子模型之内边距