线程间同步的方法
想了解线程同步的方法就得先知道什么是线程,然后线程怎么创建的,再然后就是去实现线程的同步。
什么是线程?
线程是电脑程序运行时的最小单元,一个电脑程序运行会有一个或多个线程存在。
下面我会以java代码来讲解线程间的同步方法。
操作方法
- 01
首先我们得带着问题去学习,线程为何会有同步一说? 在java中是允许多线程并发控制,当有多个线程同时操作同一个资源时,很有可能导致数据不准确,相互之间产生冲突。 打个比方:我们买火车票时某个车次的火车票只剩一张,而正好A和B同时进行购买该车票,在不同步的情况下A和B可能会都收到购买成功的结果,他们购买到的是同一张票,这显然不合理。而在同步的情况下是不可能出现该种情况的。 所以加入同步锁是为了避免在该线程没完成操作之前不被其他线程调用,从而达到资源的唯一性和准确性。 我这用的是NetBeans估计非主流了,现在大多用的是myeclipse/eclipse。 如图:
- 02
新建一个项目,我这就叫Thread_demo了。名字看自己心情命名就好。
- 03
同步方法: synchronized关键字修饰的方法即为方法的同步 代码: public synchronized void 方法名() { 需要同步的内容... } 如图:
- 04
同步代码块: synchronized关键字修饰的语句块即为方法块的同步 代码: synchronized(object){ 需要同步的内容... } 如图:
- 05
线程的同步对电脑的开销是很大的,我们应该尽量避免同步的使用,或者说能缩小同步的范围就尽量减少,能同步代码块的就不要去同步整个方法。 下面附上线程同步的运用: package thread_demo; /** * * @author Admin */ public class Thread_Demo { class Bank { private int account = 100; public int getAccount() { return account; } /** * 同步方法实现 * @param money */ public synchronized void add(int money) { account += money; } /** * 同步代码块实现 * @param money */ public void add1(int money) { synchronized (this) { account += money; } } } class CreateThread implements Runnable { private Bank bank; public CreateThread(Bank bank) { this.bank = bank; } @Override public void run() { for (int i = 0; i < 10; i++) { bank.add(10); System.out.println(i + "账户余额:" + bank.getAccount()); } } } /** * 建立线程,调用内部类 */ public void exeThread() { Bank bank = new Bank(); CreateThread new_thread = new CreateThread(bank); System.out.println("线程1"); Thread thread1 = new Thread(new_thread); thread1.start(); System.out.println("线程2"); Thread thread2 = new Thread(new_thread); thread2.start(); } public static void main(String[] args) { Thread_Demo td = new Thread_Demo(); td.exeThread(); } } 如图: 1:为加synchronized关键词的结果,即同步得到的结果 2:为不加synchronized关键词的结果,即不同步得到的结果