1.方法声明时使用,放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.
例如:
public synchronized void synMethod() {
//方法体
}
//方法体
}
2.对某一代码块使用,synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.此时,线程获得的是成员锁.例如:
publicint synMethod(int a1){
synchronized(a1) {
//一次只能有一个线程进入
}
}
synchronized(a1) {
//一次只能有一个线程进入
}
}
3.synchronized后面括号里是一对象,此时,线程获得的是对象锁.例如:
publicclass MyThread implements Runnable {
publicstaticvoid main(String args[]) {
MyThread mt =new MyThread();
Thread t1 =new Thread(mt, "t1");
Thread t2 =new Thread(mt, "t2");
Thread t3 =new Thread(mt, "t3");
Thread t4 =new Thread(mt, "t4");
Thread t5 =new Thread(mt, "t5");
Thread t6 =new Thread(mt, "t6");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
publicvoid run() {
synchronized (this) {
System.out.println(Thread.currentThread().getName());
}
}
}
publicstaticvoid main(String args[]) {
MyThread mt =new MyThread();
Thread t1 =new Thread(mt, "t1");
Thread t2 =new Thread(mt, "t2");
Thread t3 =new Thread(mt, "t3");
Thread t4 =new Thread(mt, "t4");
Thread t5 =new Thread(mt, "t5");
Thread t6 =new Thread(mt, "t6");
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
}
publicvoid run() {
synchronized (this) {
System.out.println(Thread.currentThread().getName());
}
}
}
对于3,如果线程进入,则得到当前对象锁,那么别的线程在该类所有对象上的任何操作都不能进行.在对象级使用锁通常是一种比较粗糙的方法。为什么要将整个对象都上锁,而不允许其他线程短暂地使用对象中其他同步方法来访问共享资源?如果一个对象拥有多个资源,就不需要只为了让一个线程使用其中一部分资源,就将所有线程都锁在外面。由于每个对象都有锁,可以如下所示使用虚拟对象来上锁:
class FineGrainLock {
MyMemberClass x, y;
Object xlock =new Object(), ylock =new Object();
publicvoid foo() {
synchronized(xlock) {
//access x here
}
//do something here - but don't use shared resources
synchronized(ylock) {
//access y here
}
}
publicvoid bar() {
synchronized(this) {
//access both x and y here
}
//do something here - but don't use shared resources
}
}
MyMemberClass x, y;
Object xlock =new Object(), ylock =new Object();
publicvoid foo() {
synchronized(xlock) {
//access x here
}
//do something here - but don't use shared resources
synchronized(ylock) {
//access y here
}
}
publicvoid bar() {
synchronized(this) {
//access both x and y here
}
//do something here - but don't use shared resources
}
}
4.synchronized后面括号里是类,此时,线程获得的是对象锁.例如:
class ArrayWithLockOrder{
privatestaticlong num_locks =0;
privatelong lock_order;
privateint[] arr;
public ArrayWithLockOrder(int[] a)
{
arr = a;
synchronized(ArrayWithLockOrder.class) {//-----这里
num_locks++; // 锁数加 1。
lock_order = num_locks; // 为此对象实例设置唯一的 lock_order。
}
}
publiclong lockOrder()
{
return lock_order;
}
publicint[] array()
{
return arr;
}
}
class SomeClass implements Runnable
{
publicint sumArrays(ArrayWithLockOrder a1,
ArrayWithLockOrder a2)
{
int value =0;
ArrayWithLockOrder first = a1; // 保留数组引用的一个
ArrayWithLockOrder last = a2; // 本地副本。
int size = a1.array().length;
if (size == a2.array().length)
{
if (a1.lockOrder() > a2.lockOrder()) // 确定并设置对象的锁定
{ // 顺序。
first = a2;
last = a1;
}
synchronized(first) { // 按正确的顺序锁定对象。
synchronized(last) {
int[] arr1 = a1.array();
int[] arr2 = a2.array();
for (int i=0; i<size; i++)
value += arr1[i] + arr2[i];
}
}
}
return value;
}
publicvoid run() {
//
}
}
privatestaticlong num_locks =0;
privatelong lock_order;
privateint[] arr;
public ArrayWithLockOrder(int[] a)
{
arr = a;
synchronized(ArrayWithLockOrder.class) {//-----这里
num_locks++; // 锁数加 1。
lock_order = num_locks; // 为此对象实例设置唯一的 lock_order。
}
}
publiclong lockOrder()
{
return lock_order;
}
publicint[] array()
{
return arr;
}
}
class SomeClass implements Runnable
{
publicint sumArrays(ArrayWithLockOrder a1,
ArrayWithLockOrder a2)
{
int value =0;
ArrayWithLockOrder first = a1; // 保留数组引用的一个
ArrayWithLockOrder last = a2; // 本地副本。
int size = a1.array().length;
if (size == a2.array().length)
{
if (a1.lockOrder() > a2.lockOrder()) // 确定并设置对象的锁定
{ // 顺序。
first = a2;
last = a1;
}
synchronized(first) { // 按正确的顺序锁定对象。
synchronized(last) {
int[] arr1 = a1.array();
int[] arr2 = a2.array();
for (int i=0; i<size; i++)
value += arr1[i] + arr2[i];
}
}
}
return value;
}
publicvoid run() {
//
}
}
对于4,如果线程进入,则线程在该类中所有操作不能进行,包括静态变量和静态方法,实际上,对于含有静态方法和静态变量的代码块的同步,我们通常用4来加锁.
相关推荐
"Java 中 synchronized 用法详解" Synchronized 是 Java 语言中用于解决多线程共享数据同步问题的关键字。它可以作为函数的修饰符,也可以作为函数内的语句,用于实现同步方法和同步语句块。在 Java 中,...
synchronized的两种用法** - **方法级别同步:** 可以通过在方法声明前加上`synchronized`关键字来同步整个方法。这将确保每次只有一个线程可以调用该方法。 ```java public synchronized void method() { // ...
Java 中的 synchronized 用法详解 Java 中的 synchronized 关键字是用于解决多线程并发问题的重要工具之一。它可以被用于方法、代码块和变量上,以实现对共享资源的互斥访问控制。本文将对 Java 中的 synchronized ...
在`Synchronized`压缩包中,可能包含了通过实验来演示`synchronized`关键字使用的一些Java代码。例如,创建一个共享资源类,然后通过多个线程去操作这个资源,使用`synchronized`关键字来保证线程安全。实验可能涉及...
Java 锁机制 Synchronized 是 Java 语言中的一种同步机制,用于解决多线程并发访问共享资源时可能出现的一些问题。 Java 锁机制 Synchronized 的概念 在 Java 中,每个对象都可以被看作是一个大房子,其中有多个...
本示例"java synchronized demo"旨在探讨`synchronized`关键字的用法及其作用机制。下面将详细阐述`synchronized`的相关知识点。 1. **synchronized的作用**: - `synchronized`关键字主要用于解决多线程环境中的...
`synchronized`提供了一种机制,使得在多线程环境中,对特定代码或方法的访问变得有序和安全。 首先,`synchronized`可以应用于两种情况:同步方法和同步代码块。同步方法是通过在方法声明前加上`synchronized`...
2. **synchronized的两种使用方式** - **synchronized方法**:在方法声明前加上`synchronized`关键字,整个方法体被视为同步代码块。这样,每次只有一个线程能执行该方法。 - **synchronized代码块**:使用`{}`...
`synchronized`关键字有两种主要的使用方式:一种是在方法声明中使用,另一种则是在代码块中使用。 ##### 1. synchronized方法 在方法声明中添加`synchronized`关键字,可以将整个方法体变成同步代码块。例如: `...
Java 中 synchronized 正确使用方法解析 Java 中 synchronized 关键字是解决线程安全问题的重要手段,它可以确保在多线程环境下,共享资源的访问安全性。本文将详细介绍 Java 中 synchronized 的正确使用方法,通过...
本实例大全将全面解析`synchronized`的使用方式,包括同步方法、同步语句块、类锁和对象锁。 ### 1. 同步方法 同步方法是通过在方法声明前加上`synchronized`关键字实现的。这样,同一时间只有一个线程可以执行该...
通过在方法或代码块上使用`synchronized`,可以确保同一时间只有一个线程能访问这些代码区域,从而有效避免了多线程环境下的数据竞争和不一致性问题。 #### 二、synchronized的作用机制 `synchronized`主要通过对象...
下面将详细介绍 `synchronized` 的四种主要用法。 1. **修饰实例方法**: 当 `synchronized` 修饰一个实例方法时,它会锁定当前对象的监视器,即所谓的“成员锁”。这意味着同一时间只有一个线程可以执行该方法。...
1. **对象锁**:每个Java对象都可以作为一个锁,当调用对象的`synchronized`方法或在代码块中使用`synchronized`关键字时,会获取到这个对象的锁。如果多个线程尝试访问同一个对象的同步代码,只有一个线程能够获得...
Synchronized 的使用方法有四种: 1. synchronized 修饰普通方法 2. synchronized 修饰普通代码块 3. synchronized 修饰静态方法 4. synchronized 修饰静态方法中的代码块 在使用 synchronized 同步锁时,需要注意...
java多线程中synchronized关键字的用法 解压密码 www.jiangyea.com
通过使用`synchronized`,可以确保同一时刻只有一个线程能够访问被标记为同步的方法或代码块,从而避免多线程环境下的数据不一致问题。 #### 一、基本概念 `synchronized`关键字主要具有以下特性: 1. **互斥性**...
Java 中的 Lock 和 Synchronized 的区别 Java 语言中有很多相似关键字或相似意义的字,但 lock 和 synchronized 是两个最容易混淆的关键字。它们都是锁的意思,都是为了线程安全性、应用合理性和运行效率的。下面...
"基于Java synchronized同步锁实现线程交互" Java多线程能够提高CPU利用...因此,在使用Java多线程的场景中,请充分理解Java线程各状态之间的关系及其切换,并使用synchronized、wait()和notify()方法实现线程交互。
每个Java对象都可以作为锁,当线程访问`synchronized`方法或同步代码块时,都会获取到对应的锁。对于实例方法,锁是当前对象实例;对于静态方法,锁是该类的Class对象。 5. **进入和退出同步块的规则** - **线程...