多线程学习(八)线程的同步-同步块

转载 2016年06月01日 11:30:33

转自:http://lavasoft.blog.51cto.com/62575/221922

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资源也没有意义,因为你占用着锁,其他互斥线程还是无法访问同步程序块。当然与同步程序块无关的线程可以获得更多的执行时间。
 

马士兵-多线程学习第04课 线程的同步

1.思考为什么会有线程的同步?线程不同步会带来哪些问题?        我们首先要来了解一个例子,假设我有一张银行卡和存折共享里面的钱,假设有3000块钱,有一天我去银行拿着存折去取钱,到了柜台我取...
  • hblfyla
  • hblfyla
  • 2016年11月01日 22:06
  • 625

Python多线程学习(二、线程的同步)

假设两个线程对象t1和t2都要对num=0进行增1运算,t1和t2都各对num修改10次,num的最终的结果应该为20。但是由于是多线程访问,有可能出现下面情况:在num=0时,t1取得num=0。系...

IOS多线程系统学习之线程同步与线程通信

多线程编程是有趣的事情,它很容易突然出现“错误情况”,这是由于系统的线程调度具有一定的随机性造成的。不过,即使程序偶然出现“错误情况”,这是由于系统的线程调度具有一定的随机性造成的。不过,即使程序偶然...

C# 多线程学习系列三:线程优先级、线程同步以及向线程传递参数

线程优先级         在使用线程的时候,我们经常会见到线程优先级的问题,那么什么是线程优先级呢,线程优先级决定了该线程可占用多少的CPU时间。在C#程序中,可以对线程设定五个不同的优先级,...

java多线程之线程并发库的Semaphere同步工具

Semaphore这个东西和之前的synchronized干的事差不多。  synchronized保证了,我管理的那部分代码同一时刻只有一个线程能访问  Semaphore保证了,我管理的那部分...

java多线程之线程并发库的其他同步工具类

CyclicBarrier 表示大家彼此等待,大家集合好后才开始出发,分散活动后又在指定地点集合碰面,这就好比整个公司的人员利用周末时间集体郊游一样,先各自从家出发到公司集合后,再同时出发到公园游玩,...

多线程教程之二---线程间同步

当多个线程无限制的在同一段时间内访问同一资源时,有可能导致错误的结果的发生,例: #include #include long g_iNum1,g_iNum2; DWORD WINAPI S...

多线程系列二——java线程间的互斥与同步

“线程互斥是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。”   我们可以用银行转账的例子加以说明: 1、甲乙两用户对银行...

多线程 创建-同步-线程锁-交互-线程池

iPhone 多线程   多线程在各种编程语言中都是难点,很多语言中实现起来很麻烦,objective-c虽然源于c,但其多线程编程却相当简单,可以与java相媲美。这篇文章主要从线程创建与启动、线...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程学习(八)线程的同步-同步块
举报原因:
原因补充:

(最多只允许输入30个字)