传统线程互斥技术

  1 public class TraditionalThreadSynchronized {
  2
  3     /**
  4      * @param args
  5      */
  6     public static void main(String[] args) {
  7         new TraditionalThreadSynchronized().init();
  8     }
  9
 10     private void init() {
 11         /**
 12          * 静态方法中不能NEW内部类的实例对象
 13          * 内部类可以访问外部类的成员变量,对象创建完了,成员变量才分配空间
 14          * Outputer在静态方法中创建的时候还没有TraditionalThreadSynchronized对象
 15          */
 16         final Outputer outputer = new Outputer();
 17         new Thread(new Runnable() {
 18             @Override
 19             public void run() {
 20                 while (true) {
 21                     try {
 22                         Thread.sleep(10);
 23                     }
 24                     catch (InterruptedException e) {
 25                         e.printStackTrace();
 26                     }
 27                     outputer.output("wunanjie1234");
 28                 }
 29
 30             }
 31         }).start();
 32
 33         new Thread(new Runnable() {
 34             @Override
 35             public void run() {
 36                 while (true) {
 37                     try {
 38                         Thread.sleep(10);
 39                     }
 40                     catch (InterruptedException e) {
 41                         e.printStackTrace();
 42                     }
 43                     outputer.output2("lihuoming1234");
 44                 }
 45
 46             }
 47         }).start();
 48
 49     }
 50
 51     /**
 52      *
 53      * @描述: 将名字打印在控制台上 .
 54      * 加static相当于外部类
 55      * @作者: Wnj .
 56      * @创建时间: 2017年5月15日 .
 57      * @版本: 1.0 .
 58      */
 59     static class Outputer {
 60
 61         /**
 62          *打印错乱
 63          * wunanlihuoming1234
 64          *   jie1234
 65
 66
 67          * 要实现原子性
 68          * 当有一个线程在执行该方法的时候,其它线程不能执行
 69          * <功能详细描述>
 70          * @param name
 71          */
 72         public void output(String name) {
 73             int len = name.length();
 74             //把你要保护起来的代码用synchronized关键字保护起来,进行排它性,只有当这个线程出来后,其它线程才能进去
 75             //锁一定要是同一个对象
 76             synchronized (Outputer.class) {
 77                 for (int i = 0; i < len; i++) {
 78                     System.out.print(name.charAt(i));
 79                 }
 80                 System.out.println();
 81             }
 82         }
 83
 84         public synchronized void output2(String name) {
 85             int len = name.length();
 86             for (int i = 0; i < len; i++) {
 87                 System.out.print(name.charAt(i));
 88             }
 89             System.out.println();
 90         }
 91         /**
 92          * 类的字节码在内存中也算是一份对象,静态方法运行的时候不需要创建类的实例对象,使用Outputer.class字节码就可以进行互斥
 93          * <功能详细描述>
 94          * @param name
 95          */
 96         public static synchronized void output3(String name) {
 97             int len = name.length();
 98             for (int i = 0; i < len; i++) {
 99                 System.out.print(name.charAt(i));
100             }
101             System.out.println();
102         }
103     }
104 }
时间: 2024-10-05 18:36:43

传统线程互斥技术的相关文章

3.传统线程互斥技术

线程安全问题可以用银行转账来解释 1 /** 2 * 传统的线程互斥技术 3 * @author LiTaiQing 4 */ 5 public class TraditionalThreadSynchronized { 6 7 public static void main(String[] args){ 8 new TraditionalThreadSynchronized().init(); 9 } 10 11 private void init(){ 12 /** 13 * 内部类访问局

JAVA 并发编程-传统线程互斥技术(Synchronized)(三)

java线程互斥是为了保证,同一时刻最多只有一个线程执行该段代码.那么它的出现又是为了解决什么问题呢?账户存取款,在同一时间段只能让一个人进行操作. 下面来看一个简单实例(多线程带来的问题): public class TraditionalThreadSynchronized { /** * @param args */ public static void main(String[] args) { new TraditionalThreadSynchronized().init(); }

【java并发】传统线程互斥技术—synchronized

在多个线程同时操作相同资源的时候,就会遇到并发的问题,如银行转账啊.售票系统啊等.为了避免这些问题的出现,我们可以使用synchronized关键字来解决,下面针对synchronized常见的用法做一个总结.首先写一个存在并发问题的程序,如下: public class TraditionalThreadSynchronized { public static void main(String[] args) { //在静态方法中不能new内部类的实例对象 //private Outputer

Java多线程与并发库高级应用-传统线程互斥技术

  /** * 启动两个线程分别打印两个名字,名字按照字符一个一个打印 * * @author Administrator * */ public class TraditionalThreadSynchronized { public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } public void init() { final Outputer outputer = new

传统线程互斥

传统线程的互斥技术: 关键字:Synchronized 例子: public class TraditionalThreadSynchronized { public static void main(String[] args) { new TraditionalThreadSynchronized().init(); } private void init(){ final Output output = new Output(); new Thread(new Runnable(){ @.

传统线程的创建方式

传统线程技术回顾 public class TraditionalThread { /** * @param args */ public static void main(String[] args) { //第一种:new Thread() Thread thread = new Thread(){ @Override public void run() { while(true){ try { Thread.sleep(500); } catch (InterruptedException

Java 传统线程技术

Java 多线程 在Java中,线程类Thread创建方式有两种:一是继承Thread类,重写run方法:二是,实现Runnable接口.大多数情况下,推荐使用第二种方式,实现runnable接口,这样可以很好的将任务与执行单元分离,更加突出面向对象的思想. 在JDK1.5之前,线程间互斥主依靠内置锁(监视器),而线程间通信则采用Object实例的wait,notify等方法.在JDK1.5之后,增加了很多线程新技术,如线程池.锁.信号量.条件.栅栏.阻塞队列.同步容器等. 1.       传

【java并发】传统线程技术中的定时器技术

传统线程技术中有个定时器,定时器的类是Timer,我们使用定时器的目的就是给它安排任务,让它在指定的时间完成任务.所以先来看一下Timer类中的方法(主要看常用的TimerTask()方法): 返回值 方法名 方法描述 void schedule(TimerTask task, long delay) 安排在指定延迟后执行指定的任务. void schedule(TimerTask task, long delay, long period) 安排指定的任务从指定的延迟后开始进行重复的固定延迟执

传统线程技术回顾

/** * * @描述: 传统线程技术回顾 . * <p> * *   多线程机制会提高程序的运行效率? * ============================================== 不会,会更慢,因为CPU资源有限 为什么会有多线程下载呢? 是为了抢夺服务器带宽 ============================================== 不一定,多线程又不能提高CPU的主频,也就是单位时间能够执行的指令数目,如果是一个单线程的任务, CPU也只能处理单线