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          * 内部类访问局部变量,局部变量要加final
14          *         若此代码放在main中会报错,因为静态代码块不能访问内部类
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(1000);
23                     } catch (InterruptedException e) {
24                         e.printStackTrace();
25                     }
26                     outputer.output("zhangxiaoxiang");
27                 }
28             }
29         }).start();
30         new Thread(new Runnable(){
31             @Override
32             public void run() {
33                 while(true){
34                     try {
35                         Thread.sleep(1000);
36                     } catch (InterruptedException e) {
37                         e.printStackTrace();
38                     }
39                     outputer.output("lihuoming");
40                 }
41             }
42         }).start();
43     }
44
45     static class Outputer{
46         public void output(String name){
47             int len = name.length();
48             /*
49              * 锁用任意一个对象都行,但只有同一个对象才具有互斥性
50              * 1.每个类的字节码文件只有一份,可以用来做互斥锁
51              * 2.用this也行
52              * 此处也可以在方法上架synchroized,
53              * 但从多线程效率角度来看,合理细化同步块粒度能提高执行效率,
54              * 所以此处在内部代码中加synchroized比较好
55              */
56             synchronized(Outputer.class){
57                 for(int i = 0; i < len ; i++){
58                     System.out.print(name.charAt(i));
59                 }
60                 System.out.println();
61             }
62         }
63         /**
64          * output2方法不会同步,因为方法上加synchronized相当于加this锁
65          * 但又是静态方法,所以this会失效,会出现问题。
66          * @param name
67          */
68         public static synchronized void output2(String name){
69             int len = name.length();
70             synchronized(Outputer.class){
71                 for(int i = 0; i < len ; i++){
72                     System.out.print(name.charAt(i));
73                 }
74                 System.out.println();
75             }
76         }
77     }
78 }
时间: 2024-10-11 17:42:57

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

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

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

传统线程互斥技术

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 * 内部类可以访问外部类的成员变量,对象

【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也只能处理单线