转自https://blog.csdn.net/biubiu741/article/details/77990592 i++不是原子操作,也就是说,它不是单独一条指令,而是3条指令: 1.从内存中把i的值取出来放到CPU的寄存器中 2.CPU寄存器的值+1 3.把CPU寄存器的值写回内存 多核CPU最小值为2,最大值200 i++是由3条指令构成的运算操作,两个线程在i变量上共计需要执行100(次循环)*3(条指令)*2(个线程)=600条指令,这600条指令在某种排列下会导致最终i的值仅为2.…
多线程下,两个线程交替打印0 -100,使用wait()和notify() public class ThreadTest{ private static final Object lock = new Object(); static class ThreadA extends Thread{ @Override public void run() { for (int i = 0; i < 100; i = i+2) { synchronized (lock){ lock.notify();…
背景:是这样的今天在地铁上浏览了以下网页,看到网上一朋友问了一个多线程的问题.晚上闲着没事就决定把它实现出来. 题目: 1.开启两个线程,一个线程打印A-Z,两一个线程打印1-52的数据. 2.实现交替打印,输出结果为12A34B...........5152Z. 3.请用多线程方式实现. 这种只有两个线程交替打印数据的题目其实相对还是比较简单的,如果利用传统线程无非就是synchronized(线程互斥)与wait(),notify()的问题. 今天不用传统线程解决这个问题,我们用Java 1…
开启两个线程,一个线程打印A-Z,一个线程打印1-52的数据 import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; public class D20190803 { private char a='A'; private Lock lock = new ReentrantLock();…
有三个线程,a.b.c,a打印“T1”,b打印“T2”,c打印“T3”,a执行完后,b执行:b执行完后,c执行.如此循环100遍. package com.company; /** * 测试三个线程协同运行 * * @Auther: xxx * @Date: Created In 2018/1/1 22:18 * @Modified By: */ public class TestThread { public static void main(String[] args) { Thread1…
package cn.usst.DataTest6; /** * 设计四个线程,当中共两个线程每次对j添加1,另外两个线程每次对j降低1.循环100次,写出程序. * @ * */ public class DataTest6 { private int j; public static void main(String[] args) { DataTest6 dt = new DataTest6(); Inc inc = dt.new Inc(); Dec dec = dt.new Dec()…
题目: 写两个线程,一个线程打印1-52,另一个线程打印A-Z,打印顺序为12A34B56C......5152Z.要求用线程间的通信. /** * 写两个线程,第一个线程打印1-52,第二个线程打印A-Z,打印结果为12A34B...5152Z */public class ThreadPrinter { // true打印数字,false打印字母 private boolean flag = true; // 打印字母 public synchronized void printNumber…
解题思路 实现一个类OddEven 有一个打印奇数的方法,有一个打印偶数的方法. 类中有一个volatile变量 ,用来控制当前状态是该哪个方法打印. 方法中打印每个数前首先判断volatile变量的状态,不该自己打印就使用Thread.yield()让出CPU,该自己就打印并调换状态. 在主函数中,两个线程共享一个OddEven实例,并调用打印奇数的方法或打印偶数的方法. 本质是线程的协作. 代码 class OddEven { int n; boolean flag = true;// fl…
//2019/06/13 本周HT面试遇到的问题,答得不是很好,自己重新做一下.面试只需要写出线程间通信的方式,//我当时大致知道思路,因为之前看过马士兵老师的多线程视频,但是代码写出来估计编译都是报错的.//线程通信方式public class ThreadTwo { //内部静态类,类去实现Runnable接口,obj通过构造方法,是希望这两个方法被一个参数锁住 public static class PrintABC implements Runnable{ Object o = null…
本文旨在两个线程交替运行,不多哔哔直接看代码吧 public class Work2 { static final Object object = new Object(); public static void main(String[] args) { Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized (object) { for (int i = 1; i < 10; i +…