虽然做java已经两年多了,但说真的对java中所谓的线程同步异步这类的东东还真不是非常的了解,由于最近在研究android上的游戏开发,看到一个游戏demo里到处都充斥着 synchronized这个关键字,而且由于在游戏开发中对线程的使用十分多,所以便写下了这些东东(高手直接忽略就可以了)。
若有幸被高手看到了这篇博文,如果有错误的话请指出,不胜感激。
关于synchronized关键字我自己写了个测试程序运行了一下,具体情况如下:
先把测试代码贴上来看看:
测试代码1:
class TxtThread implements Runnable {
int num = 4;
String str = new String();
@Override
public void run() {
// TODO Auto-generated method stub
int i = 0;
while(i < 5){
synchronized (str) {
if(num > 0){
try {
System.out.println(Thread.currentThread().getName() + " : " + i);
Thread.sleep(500);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.getMessage();
}
i++;
}
}
}
}
}
测试代码2:
public class Sync {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
TxtThread tt = new TxtThread();
Thread t1 = new Thread(tt,"A");
Thread t2 = new Thread(tt,"B");
Thread t3 = new Thread(tt,"C");
Thread t4 = new Thread(tt,"D");
t1.start();
t2.start();
t3.start();
t4.start();
}
}
运行Sync的结果如下:
运行结果1
第一次运行
B : 0
B : 1
B : 2
B : 3
C : 0
C : 1
A : 0
D : 0
A : 1
A : 2
A : 3
C : 2
C : 3
C : 4
B : 4
A : 4
D : 1
D : 2
D : 3
D : 4
-----------
第二次运行
A : 0
A : 1
D : 0
D : 1
D : 2
D : 3
D : 4
B : 0
B : 1
C : 0
C : 1
B : 2
B : 3
B : 4
A : 2
A : 3
A : 4
C : 2
C : 3
C : 4
-----------
从上面的运行结果来看,线程A、B、C、D都是逐个运行的,只不过这四个线程在运行过程中出现了对系统资源的竞争(我是这么理解的),所以导致了上面的情况发生(比如线程A运行了两步然后线程D又运行了三步,我认为这种情况是线程之间对系统资源的竞争引起的),但有一个地方是可以看出来的,线程A、B、C、D并没有同时开始运行,莫非这就是所谓的互斥?
将TxtThread类的run方法中的代码去掉synchronized包裹层去掉,运行结果如下
运行结果2
第一次运行
B : 0
D : 0
A : 0
C : 0
B : 1
D : 1
C : 1
A : 1
B : 2
D : 2
C : 2
A : 2
D : 3
B : 3
A : 3
C : 3
D : 4
B : 4
A : 4
C : 4
-----------
第二次运行
A : 0
C : 0
B : 0
D : 0
A : 1
C : 1
B : 1
D : 1
A : 2
B : 2
C : 2
D : 2
A : 3
C : 3
B : 3
D : 3
C : 4
B : 4
A : 4
D : 4
从上面的运行结果来看,线程A、B、C、D是同时开始运行的,莫非这就是所谓的同步访问?
下面的内容引用自http://java.chinaitlab.com/base/818583.html
在java编程思想中对synchronized的一点解释:
1、synchronized关键字的作用域有二种:
1)是某个对象实例内,synchronized aMethod(){}可以防止多个线程同时访问这个对象的synchronized方法(如果一个对象有多个synchronized方法,只要一个线程访问了其中的一个synchronized方法,其它线程不能同时访问这个对象中任何一个synchronized方法)。这时,不同的对象实例的synchronized方法是不相干扰的。也就是说,其它线程照样可以同时访问相同类的另一个对象实例中的synchronized方法;
2)是某个类的范围,synchronized static aStaticMethod{}防止多个线程同时访问这个类中的synchronized static 方法。它可以对类的所有对象实例起作用。
2、除了方法前用synchronized关键字,synchronized关键字还可以用于方法中的某个区块中,表示只对这个区块的资源实行互斥访问。用法是: synchronized(this){/*区块*/},它的作用域是当前对象;
3、synchronized关键字是不能继承的,也就是说,基类的方法synchronized f(){} 在继承类中并不自动是synchronized f(){},而是变成了f(){}。继承类需要你显式的指定它的某个方法为synchronized方法;
从上面引用的内容来看,当测试程序中的TxtThread中的synchronized没有被删除的时候,相当于4个线程(A、B、C、D)同时访问了一个对象的同步方法,那么当线程A、B、C、D全部执行start方法时,它们应该是首先对系统资源进行竞争获得运行时间然后占用TxtThread的run方法中的同步语句块部分,直到某个线程运行完成之后才能允许下一个线程,这样理解的话感觉跟上面的运行结果1不结果不一样,我看了一下资料,我们在TxtThread的run方法中只是对部分关键代码进行了同步,也就是说不同的线程还是可以同时访问TxtThread方法中的run方法的,如果我们将TxtTHread的run方法中的内容写入到另外一个方法runtest()方法中,并将runtest()方法使用synchronized函数进行修饰并将其放到TxtThread的run方法中调用,那么我们就会看到下面的运行效果了,
A : 0
A : 1
A : 2
A : 3
A : 4
D : 0
D : 1
D : 2
D : 3
D : 4
C : 0
C : 1
C : 2
C : 3
C : 4
B : 0
B : 1
B : 2
B : 3
B : 4
这样就符合引用内容中的第一条所说的情况了
分享到:
相关推荐
Java中的`synchronized`关键字是多线程编程中的一个重要概念,用于控制并发访问共享资源时的同步机制。在Java中,当多个线程试图同时访问和修改同一块代码或数据时,可能会导致数据不一致的问题。为了解决这个问题,...
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
synchronized关键字是Java中实现线程同步的重要工具。通过本文的探讨,我们了解到了synchronized的工作原理、基本用法、以及在实际编程中的应用。合理使用synchronized可以有效地解决多线程环境下的并发问题,但也要...
Java 线程同步机制中 synchronized 关键字的理解 Java 的线程同步机制是为了解决多个线程共享同一片存储空间所带来的访问冲突问题。其中,synchronized 关键字是 Java 语言中解决这种冲突的重要机制。 ...
Java 中的 synchronized 关键字与线程平安问题 在 Java 中,synchronized 关键字是一个非常重要的概念,它用于解决线程同步问题。但是,很多开发者对 synchronized 关键字的理解并不够深入,本文将通过实例解析 ...
### synchronized关键字的深入解析 #### 一、synchronized关键字的重要性 `synchronized`关键字在Java语言中扮演着极其重要的角色,它是实现线程安全的核心手段之一。通过`synchronized`关键字,开发人员可以在多...
Java中的`synchronized`关键字是用于实现线程同步的关键机制,它的主要目的是确保在多线程环境中,对共享资源的访问能够保持数据的一致性和完整性。本文将深入探讨`synchronized`的两种主要用法:synchronized方法和...
Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,synchronized 关键字可以作用于 instance 变量...
一、synchronized关键字的作用与原理 `synchronized`关键字主要有两个作用:同步方法和同步块。它通过锁机制来实现线程同步,防止多个线程同时执行同一段代码,可能导致的数据不一致问题。 1. 同步方法:当在方法...
Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized 用法进行详细的解释和分析。 一、...
本文深入探讨了Java中用于解决并发编程中线程安全问题的synchronized关键字。文章首先讨论了多线程编程中临界资源的概念,包括对象、变量、文件等,以及同步机制的必要性。重点解析了synchronized的工作原理,包括其...
在Java编程语言中,`synchronized`关键字是一个非常重要的概念,它主要用于多线程环境中的线程同步,确保共享资源的正确访问,防止数据不一致性。以下是对`synchronized`关键字使用方法的详细讲解: 1. **修饰实例...
Synchronized 关键字是 Java 并发编程中最基本的同步机制,它可以保证线程安全,包括原子性、可见性和有序性。Synchronized 关键字可以修饰方法或代码块,使得在同一时刻只有一个线程可以执行该方法或代码块,从而...
本文将探讨Synchronized关键字在解决并发控制中的作用及其使用方式。 首先,让我们回顾一下问题的背景:在给出的示例代码中,创建了10个线程,每个线程都对共享变量`count`进行10000000次的累加操作。理论上,最终...
例如,在 Java 6 中,synchronized 关键字的实现原理是偏斜锁,而在 Java 8 中,synchronized 关键字的实现原理是轻量级锁。 synchronized 关键字是 Java 多线程与并发中的重要工具,可以实现线程安全的数据共享和...
本文将详细介绍Java中的一些核心关键字,并提供相应的解释和示例。 #### 关键字列表 根据给定的部分内容,我们可以列出以下Java关键字: 1. **abstract** 2. **continue** 3. **for** 4. **new** 5. **switch** 6...
在Java编程中,`synchronized`关键字是用来解决多线程环境下的线程安全问题的关键工具。线程安全意味着当多个线程访问同一段代码时,该代码能够正确地处理并发情况,不会出现数据不一致或者资源竞争的问题。本文将...
`synchronized` 是 Java 中的关键字之一,用于实现线程间的同步控制,确保共享资源的安全访问。它主要应用于以下两种场景: 1. **同步方法**:在类的方法声明前加上 `synchronized` 关键字,则该方法成为同步方法。...
在Java编程语言中,`synchronized`关键字是用于实现线程同步的重要机制,它确保了在多线程环境中的数据一致性与安全性。本篇将详细解析`synchronized`的关键特性和使用方法,帮助开发者深入理解如何在并发编程中有效...
### Synchronized关键字在Java中的应用 #### 概述 `synchronized`是Java语言中的一个关键字,主要用于实现线程同步,防止多个线程同时访问共享资源而导致的数据不一致问题。通过`synchronized`关键字,开发者可以...