`
xuedong
  • 浏览: 298697 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Java线程:线程的同步-同步块

    博客分类:
  • java
阅读更多
Java线程:线程的同步-同步块
 
对于同步,除了同步方法外,还可以使用同步代码块,有时候同步代码块会带来比同步方法更好的效果。
 
追其同步的根本的目的,是控制竞争资源的正确的访问,因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可,因此Java引入了同步代码快的策略,以提高性能。
 
在上个例子的基础上,对oper方法做了改动,由同步方法改为同步代码块模式,程序的执行逻辑并没有问题。
 
 
/**
* Java线程:线程的同步-同步代码块
*
* @author leizhimin 2009-11-4 11:23:32
*/

public class Test {
        public static void main(String[] args) {
                User u = new User("张三", 100);
                MyThread t1 = new MyThread("线程A", u, 20);
                MyThread t2 = new MyThread("线程B", u, -60);
                MyThread t3 = new MyThread("线程C", u, -80);
                MyThread t4 = new MyThread("线程D", u, -30);
                MyThread t5 = new MyThread("线程E", u, 32);
                MyThread t6 = new MyThread("线程F", u, 21);

                t1.start();
                t2.start();
                t3.start();
                t4.start();
                t5.start();
                t6.start();
        }
}

class MyThread extends Thread {
        private User u;
        private int y = 0;

        MyThread(String name, User u, int y) {
                super(name);
                this.u = u;
                this.y = y;
        }

        public void run() {
                u.oper(y);
        }
}

class User {
        private String code;
        private int cash;

        User(String code, int cash) {
                this.code = code;
                this.cash = cash;
        }

        public String getCode() {
                return code;
        }

        public void setCode(String code) {
                this.code = code;
        }

        /**
         * 业务方法
         *
         * @param x 添加x万元
         */

        public void oper(int x) {
                try {
                        Thread.sleep(10L);
                        synchronized (this) {
                                this.cash += x;
                                System.out.println(Thread.currentThread().getName() + "运行结束,增加“" + x + "”,当前用户账户余额为:" + cash);
                        }
                        Thread.sleep(10L);
                } catch (InterruptedException e) {
                        e.printStackTrace();
                }
        }

        @Override
        public String toString() {
                return "User{" +
                                "code='" + code + '\'' +
                                ", cash=" + cash +
                                '}';
        }
}
 
线程E运行结束,增加“32”,当前用户账户余额为:132
线程B运行结束,增加“-60”,当前用户账户余额为:72
线程D运行结束,增加“-30”,当前用户账户余额为:42
线程F运行结束,增加“21”,当前用户账户余额为:63
线程C运行结束,增加“-80”,当前用户账户余额为:-17
线程A运行结束,增加“20”,当前用户账户余额为:3

Process finished with exit code 0
 
注意:
在使用synchronized关键字时候,应该尽可能避免在synchronized方法或synchronized块中使用sleep或者yield方法,因为synchronized程序块占有着对象锁,你休息那么其他的线程只能一边等着你醒来执行完了才能执行。不但严重影响效率,也不合逻辑。
同样,在同步程序块内调用yeild方法让出CPU资源也没有意义,因为你占用着锁,其他互斥线程还是无法访问同步程序块。当然与同步程序块无关的线程可以获得更多的执行时间。
 
 

本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/221922

分享到:
评论

相关推荐

    Java多线程编程总结

    Java线程:线程的同步-同步块 Java线程:并发协作-生产者消费者模型 Java线程:并发协作-死锁 Java线程:volatile关键字 Java线程:新特征-线程池 Java线程:新特征-有返回值的线程 Java线程:新特征-锁(上) Java...

    java线程详解

    八、线程同步小结 Java线程:线程的交互 Java线程:线程的调度-休眠 Java线程:volatile关键字 Java线程:新特征-线程池 一、固定大小的线程池 二、单任务线程池 三、可变尺寸的线程池 四、延迟连接池 五、...

    Java 线程开发讲座

    #### 八、Java线程:线程的同步-同步方法与同步块 - **同步方法**:使用`synchronized`关键字修饰的方法,对整个方法进行同步。 - **同步块**:使用`synchronized`关键字加锁对象,只对特定代码段进行同步。 - **锁...

    Java多线程编程经验

    #### 九、Java线程:线程的同步-同步方法与同步块 同步方法和同步块是实现线程安全的基本手段。同步方法简单易用,而同步块则更加灵活,可以根据需要选择锁定特定的对象。 #### 十、Java线程:并发协作-生产者消费...

    Java多线程运算集合

    #### 八、Java线程的同步-同步方法与同步块 - **同步方法**: - 通过在方法声明前加上 `synchronized` 关键字,可以实现对整个方法的同步。 - 同步方法适用于类的所有实例共享同一个锁的情况。 - **同步块**: ...

    java多线程编程总结

    #### 八、Java线程:线程的同步-同步方法与同步块 - **同步方法** 通过在方法签名前添加 `synchronized` 关键字,可以保证该方法在同一时间只能由一个线程访问。 - **同步块** 通过使用 `synchronized (obj) { ...

    java实验实验报告 add 实验一:多线程/2.Runnable接口. 实验八:JDBC数据库编程二-存储过程

    重命名 实验三多:线程同步与协作:生产者与消费者 为 实验三:多线程同步与协作:生产者与消费者 实验九:使用jdbc存取大文本 add 实验九:使用jdbc存取大文本. 实验二:多线程打字游戏 add 实验二:多线程...

    JAVA线程高级-线程按序交替执行

    然而,在某些场景下,我们可能需要控制线程的执行顺序,确保它们按照特定的顺序交替运行,这在并发编程中被称为线程同步或线程协调。Java提供了一些高级特性来实现这样的需求,比如`Thread`类、`synchronized`关键字...

    JAVA 线程实现数据库的主从同步更新

    在Java编程环境中,...总之,使用Java线程实现数据库主从同步更新是一种常见且实用的技术手段,它涉及到多线程编程、数据库操作、事务管理等多个方面。理解和掌握这些知识点对于开发高可用性的分布式系统至关重要。

    Java多线程

    #### 八、Java线程:线程的同步-同步方法与同步块 Java中可以通过定义同步方法或使用同步块来实现线程同步。同步方法通过隐式锁定对象来防止多个线程同时访问,而同步块则可以更精确地控制同步范围。 #### 九、...

    学习多线程之一:线程通信--利用事件对象.zip_线程通信

    本教程将聚焦于利用事件对象进行线程间的通信,这是实现多线程同步的一种常见方法。 事件对象,通常称为信号量或事件标志,在Windows API中,它是一个内建的同步机制,允许线程等待特定事件的发生,或者通过设置...

    JavaMultiThreadingExamples:带有中文注释的基本Java多线程示例

    3- Java多线程:同步 4- Java多线程:锁定对象 5- Java多线程:线程池 6- Java多线程:倒计时闩锁 7- Java多线程:生产者-消费者 8- Java多线程:等待并通知 9- Java多线程:低级生产者-消费者 10- Java多线程:可重...

    Java多线程-同步机制解决线程安全问题方式一:同步代码块

    总结来说,Java中的同步代码块是一种有效的解决线程安全问题的手段,通过限制对共享资源的并发访问,可以保证数据的一致性和线程的安全性。然而,过度使用同步可能会降低程序的性能,因此需要合理设计同步范围,确保...

    MultithreadingJava:来自Cave of Programming http的John Purcell的Java多线程课程代码

    3- Java 多线程:同步 4- Java 多线程:锁定对象 5- Java 多线程:线程池 6- Java 多线程:倒计时锁存器 7- Java 多线程:生产者-消费者 8- Java 多线程:等待和通知 9- Java 多线程:低级生产者-消费者 10- Java 多...

    Java 多线程课程的代码及少量注释.zip

    Java 多线程主题1- Java 多线程启动线程2- Java 多线程Volatile – 基本线程通信3- Java 多线程同步4- Java 多线程锁对象5- Java 多线程线程池6- Java 多线程倒计时闩锁7- Java 多线程生产者-消费者8- Java 多线程...

    JAVA多线程总结

    **五、Java线程:线程的同步与锁** - **同步**:防止多个线程同时访问共享资源,如`synchronized`关键字用于同步方法或同步块。 - **锁**:包括内置锁(监视器锁)和显式锁(如ReentrantLock),用于控制对共享资源...

    线程同步(synchronized)1---马克-to-win java视频 java视频

    线程同步(synchronized)1---马克-to-win java视频 java视频

    java线程 线程学习资料 java线程教程

    ### Java线程教程知识点梳理 #### 一、教程概述 - **目标读者**: 本教程主要面向具备丰富Java基础知识但缺乏多线程编程经验的学习者。 - **学习成果**: 学习者能够掌握编写简单的多线程程序的能力,并能够理解和...

Global site tag (gtag.js) - Google Analytics