知识大全 线程的同步-同步块
Posted 账户
篇首语:沉舟侧畔千帆进,病树前头万木春。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 线程的同步-同步块相关的知识,希望对你有一定的参考价值。
Java线程:线程的同步-同步块 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
对于同步 除了同步方法外 还可以使用同步代码块 有时候同步代码块会带来比同步方法更好的效果 追其同步的根本的目的 是控制竞争资源的正确的访问 因此只要在访问竞争资源的时候保证同一时刻只能一个线程访问即可 因此Java引入了同步代码快的策略 以提高性能 在上个例子的基础上 对oper方法做了改动 由同步方法改为同步代码块模式 程序的执行逻辑并没有问题 /** * Java线程 线程的同步 同步代码块 * * @author leizhimin : : */ public class Test public static void main(String[] args) User u = new User( 张三 ); MyThread t = new MyThread( 线程A u ); MyThread t = new MyThread( 线程B u ); MyThread t = new MyThread( 线程C u ); MyThread t = new MyThread( 线程D u ); MyThread t = new MyThread( 线程E u ); MyThread t = new MyThread( 线程F u ); t start(); t start(); t start(); t start(); t start(); t start(); class MyThread extends Thread private User u; private int y = ; 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) de = code; this cash = cash; public String getCode() return code; public void setCode(String code) de = code; /** * 业务方法 * * @param x 添加x万元 */ public void oper(int x) try Thread sleep( L); synchronized (this) this cash += x; System out println(Thread currentThread() getName() + 运行结束 增加 + x + 当前用户账户余额为 + cash); Thread sleep( L); catch (InterruptedException e) e printStackTrace(); @Override public String toString() return User + code= + code + \\ + cash= + cash + ; 线程E运行结束 增加 当前用户账户余额为 线程B运行结束 增加 当前用户账户余额为 线程D运行结束 增加 当前用户账户余额为 线程F运行结束 增加 当前用户账户余额为 线程C运行结束 增加 当前用户账户余额为 线程A运行结束 增加 当前用户账户余额为 Process finished with exit code 注意 在使用synchronized关键字时候 应该尽可能避免在synchronized方法或synchronized块中使用sleep或者yield方法 因为synchronized程序块占有着对象锁 你休息那么其他的线程只能一边等着你醒来执行完了才能执行 不但严重影响效率 也不合逻辑 同样 在同步程序块内调用yeild方法让出CPU资源也没有意义 因为你占用着锁 其他互斥线程还是无法访问同步程序块 当然与同步程序块无关的线程可以获得更多的执行时间 cha138/Article/program/Java/hx/201311/25673相关参考