java synchronized(一)

java synchronized主要用于控制线程同步,中间有很多小的细节,知识,这里我简单的整理一下,做个记录。主要用于方法和代码块的控制

先说说方法控制

模拟银行存款和取款,创建一个Account类,两个属性,一个name和accout。先存1w进去,在用一100个线程取钱1k和存1k。等待所有线程结束后,输出account。没有synchronized控制会造成account不等于1w。使用了synchronized结果正确,性能降低了很多。下面贴一下代码

参考:http://www.cnblogs.com/devinzhang/archive/2011/12/14/2287675.html

Account.java

 1 package com.gxf.thread;
 2
 3 public class Account {
 4     public String name;
 5     public float amount;
 6
 7     public Account(String name, float amount){
 8         this.name = name;
 9         this.amount = amount;
10     }
11
12     /**
13      * 模拟存钱
14      * @param amt
15      */
16     public synchronized void deposit(float amt){
17         float tmp = amount;
18         tmp += amt;
19         try {
20             Thread.sleep(100);
21         } catch (InterruptedException e) {
22
23             e.printStackTrace();
24         }
25         this.amount = tmp;
26     }
27
28     /**
29      * 模拟取钱
30      * @param amt
31      */
32     public synchronized void withdraw(float amt){
33         float tmp = amount;
34         tmp -= amt;
35         try {
36             Thread.sleep(100);
37         } catch (InterruptedException e) {
38
39             e.printStackTrace();
40         }
41
42         amount = tmp;
43     }
44 }

测试类AccountTest.java

 1 package com.gxf.thread;
 2
 3 public class AccountTest {
 4
 5     public static void main(String[] args) {
 6         final int NUM_THREADS = 5;                    //线程总数
 7         Thread threads[] = new Thread[NUM_THREADS];
 8         final Account zhangsan = new Account("zhangsan", 10000);        //张三存1w到银行
 9
10         //1000个线程对张三账户进行存钱1k和取1k
11         for(int i = 0; i < NUM_THREADS; i++){
12             threads[i] = new Thread(new Runnable(){
13
14                 @Override
15                 public void run() {
16                     zhangsan.deposit(1000);
17                     zhangsan.withdraw(1000);
18                 }
19
20             });
21             threads[i].start();                        //线程开始
22         }
23         //等待所有线程结束
24         for(int i = 0; i < NUM_THREADS; i++){
25             try {
26                 threads[i].join();                    //等待该线程结束
27             } catch (InterruptedException e) {
28                 // TODO Auto-generated catch block
29                 e.printStackTrace();
30             }
31         }
32         System.out.println("account = " + zhangsan.amount);
33     }
34
35 }

还有就是修饰一个代码块

参考:http://javacrazyer.iteye.com/blog/759300/

类LockThread向屏幕输出1-9

两个线程同时访问lockThread向屏幕输出的方法,不同步将会输出如:1 1 2 2 3 3...用了同步输出如:1 2 3 ...1 2 3...

LockThread.java

 1 package com.gxf.thread;
 2
 3 public class LockThread implements Runnable {
 4
 5     @Override
 6     public void run() {
 7         synchronized(this){
 8             for(int i = 1; i < 10; i++){
 9                 System.out.println(i);
10                 try {
11                     Thread.sleep(1000);
12                 } catch (InterruptedException e) {
13
14                     e.printStackTrace();
15                 }
16             }
17         }
18
19     }
20
21 }

测试代码

LockThreadTest.java

 1 package com.gxf.thread;
 2
 3 public class LockThreadTest {
 4
 5     public static void main(String[] args) {
 6         LockThread lockThread = new LockThread();
 7         Thread thread1 = new Thread(lockThread);
 8         Thread thread2 = new Thread(lockThread);
 9
10         thread1.start();
11         thread2.start();
12
13     }
14
15 }

ps:我也没检查synchronized拼对没有~

时间: 2024-11-08 09:51:39

java synchronized(一)的相关文章

Java synchronized 总结

在Java开发的时候经常会用到关键字synchronized来对代码进行同步,在使用的过程中,对于synchronized确不是很熟悉,最近在看Spring源码时,发现有不少地方都用到同步,因此,趁此机会,研究一下. 1. synchronized锁的对象 Java中的每一个对象都可以作为锁. 1)对于同步方法,锁是当前实例对象. 2)对于静态同步方法,锁是当前对象的Class对象.因为在Java 虚拟机中一个类只能对应一个类对象,所以同时只允许一个线程执行同一个类中的静态同步方法. 3)对于同

Java synchronized详解

Java synchronized详解 第一篇: 使用synchronized 在编写一个类时,如果该类中的代码可能运行于多线程环境下,那么就要考虑同步的问题.在Java中内置了语言级的同步原语--synchronized,这也大大简化了Java中多线程同步的使用.我们首先编写一个非常简单的多线程的程序,是模拟银行中的多个线程同时对同一个储蓄账户进行存款.取款操作的. 在程序中我们使用了一个简化版本的Account类,代表了一个银行账户的信息.在主程序中我们首先生成了1000个线程,然后启动它们

java synchronized

synchronized 关键字,它包括两种用法:synchronized 方法和 synchronized 块.  1. synchronized 方法:通过在方法声明中加入 synchronized关键字来声明 synchronized 方法.如:  public synchronized void accessVal(int newVal);  synchronized 方法控制对类成员变量的访问:每个类实例对应一把锁,每个 synchronized 方法都必须获得调用该方法的类实例的锁方

java synchronized使用

java synchronized 基本上,所有并发的模式在解决线程冲突问题的时候,都是采用序列化共享资源的方案.这意味着在给定时刻只允许一个任务访问该资源.这个一般通过在代码上加一条锁语句实现,因为锁语句产生一种互斥排斥的效果,这种机制常常被称为互斥机制. 线程是簇拥在共享资源门前,并不是排队进入,可以通过yield()和setPriority()来给线程调度提供建议,但这些建议未必会有多大的效果.这取决与你的具体平台和vm的实现:)--//from <think in java> java

java synchronized wait

在多个线程要互斥访问数据,但线程间需要同步时——例如任务分多个阶段,特定线程负责特定阶段的情况,经常合作使用synchronized 和 wait() /** * * 计算输出其他线程锁计算的数据 * @author * */ public class Main { public static void main(String[] args) { ThreadB b = new ThreadB(); b.start();// 启动计算线程 synchronized (b) { try { Sys

Java Synchronized 与 ThreadLocal 异同

同:都是为了线程安全 异:synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问.而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时间访问到的并不是同一个对象, 这样就隔离了多个线程对数据的数据共享.而Synchronized却正好相反,它用于在多个线程间通信时能够获得数据共享.Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的 数据隔离.当然ThreadLocal并不能替代synchronized,它们处理

Java Synchronized 关键字

本文内容 Synchronized 关键字 示例 Synchronized 方法 内部锁(Intrinsic Locks)和 Synchronization 参考资料 下载 Demo Synchronized 关键字 Java 语言提供两个基本的同步机制:synchronized 方法(synchronized methods )和 synchronized  语句(synchronized statements). 示例 先大概说一下 Java Synchronized 关键字,当它用来修饰一

Java Synchronized Blocks

From http://tutorials.jenkov.com/java-concurrency/synchronized.html By Jakob Jenkov Table of Contents The Java synchronized Keyword Synchronized Instance Methods Synchronized Static Methods Synchronized Blocks in Instance Methods Synchronized Blocks

Java synchronized 关键字详解

Java synchronized 关键字详解 前置技能点 进程和线程的概念 线程创建方式 线程的状态状态转换 线程安全的概念 synchronized 关键字的几种用法 修饰非静态成员方法 synchronized public void sync(){ } 修饰静态成员方法 synchronized public static void sync(){ } 类锁代码块 synchronized (类.class){ } 对象锁代码块 synchronized (this|对象){ } syn