android开发之synchronized的用法
2015-12-16 09:27
537 查看
android开发之synchronized的用法
在android开发中synchronized主要有四种用法。第一是在方法声明时使用;第二是在对某一代码块时使用;第三是对某一对象使用;第四是对某一类使用。具体的实现代码如下:
1.方法声明时使用
放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.
例如:
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_0.gif)
public
synchronized void synMethod() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_1.gif)
//方法体
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_2.gif)
}
2.对某一代码块使用
synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.此时,线程获得的是成员锁.例如:
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_3.gif)
public
int synMethod(int a1){
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_4.gif)
synchronized(a1)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_5.gif)
//一次只能有一个线程进入
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_6.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_7.gif)
}
3.对某一对象使用
synchronized后面括号里是一对象,此时,线程获得的是对象锁.例如:
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_8.gif)
public
class MyThread implements Runnable {
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_9.gif)
public
static void main(String args[]) {
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_10.gif)
MyThread
mt = new MyThread();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_11.gif)
Thread
t1 = new Thread(mt, "t1");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_12.gif)
Thread
t2 = new Thread(mt, "t2");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_13.gif)
Thread
t3 = new Thread(mt, "t3");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_14.gif)
Thread
t4 = new Thread(mt, "t4");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_15.gif)
Thread
t5 = new Thread(mt, "t5");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_16.gif)
Thread
t6 = new Thread(mt, "t6");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_17.gif)
t1.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_18.gif)
t2.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_19.gif)
t3.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_20.gif)
t4.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_21.gif)
t5.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_22.gif)
t6.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_23.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_24.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_25.gif)
public
void run() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_26.gif)
synchronized
(this) {
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_27.gif)
System.out.println(Thread.currentThread().getName());
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_28.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_29.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_30.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_31.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_33.gif)
class
FineGrainLock {
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_34.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_35.gif)
MyMemberClass
x, y;
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_36.gif)
Object
xlock = new Object(), ylock = new Object();
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_37.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_38.gif)
public
void foo() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_39.gif)
synchronized(xlock)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_40.gif)
//access
x here
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_41.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_42.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_43.gif)
//do
something here - but don"t use shared resources
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_44.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_45.gif)
synchronized(ylock)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_46.gif)
//access
y here
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_47.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_48.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_49.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_50.gif)
public
void bar() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_51.gif)
synchronized(this)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_52.gif)
//access
both x and y here
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_53.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_54.gif)
//do
something here - but don"t use shared resources
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_55.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_56.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_57.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_58.gif)
4.对类使用时
synchronized后面括号里是类,此时,线程获得的是对象锁.例如:
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_59.gif)
class
ArrayWithLockOrder{
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_60.gif)
private
static long num_locks = 0;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_61.gif)
private
long lock_order;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_62.gif)
private
int[] arr;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_63.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_64.gif)
public
ArrayWithLockOrder(int[] a)
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_65.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_66.gif)
arr
= a;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_67.gif)
synchronized(ArrayWithLockOrder.class)
{//-----这里
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_68.gif)
num_locks++;
// 锁数加 1。
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_69.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_70.gif)
lock_order
= num_locks; // 为此对象实例设置唯一的 lock_order。
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_71.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_72.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_73.gif)
public
long lockOrder()
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_74.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_75.gif)
return
lock_order;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_76.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_77.gif)
public
int[] array()
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_78.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_79.gif)
return
arr;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_80.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_81.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_82.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_83.gif)
class
SomeClass implements Runnable
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_84.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_85.gif)
public
int sumArrays(ArrayWithLockOrder a1,
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_86.gif)
ArrayWithLockOrder
a2)
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_87.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_88.gif)
int
value = 0;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_89.gif)
ArrayWithLockOrder
first = a1; // 保留数组引用的一个
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_90.gif)
ArrayWithLockOrder
last = a2; // 本地副本。
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_91.gif)
int
size = a1.array().length;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_92.gif)
if
(size == a2.array().length)
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_93.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_94.gif)
if
(a1.lockOrder() > a2.lockOrder()) // 确定并设置对象的锁定
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_95.gif)
{
// 顺序。
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_96.gif)
first
= a2;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_97.gif)
last
= a1;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_98.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_99.gif)
synchronized(first)
{ // 按正确的顺序锁定对象。
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_100.gif)
synchronized(last)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_101.gif)
int[]
arr1 = a1.array();
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_102.gif)
int[]
arr2 = a2.array();
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_103.gif)
for
(int i=0; i
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_104.gif)
value += arr1[i] + arr2[i];
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_105.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_106.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_107.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_108.gif)
return value;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_109.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_110.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_111.gif)
public void run() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_112.gif)
//
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_113.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_114.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_115.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_116.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_117.gif)
对于4,如果线程进入,则线程在该类中所有操作不能进行,包括静态变量和静态方法,实际上,对于含有静态方法和静态变量的代码块的同步,我们通常用4来加锁.
以上为synchronized的四种用法。
在android开发中synchronized主要有四种用法。第一是在方法声明时使用;第二是在对某一代码块时使用;第三是对某一对象使用;第四是对某一类使用。具体的实现代码如下:
1.方法声明时使用
放在范围操作符(public等)之后,返回类型声明(void等)之前.这时,线程获得的是成员锁,即一次只能有一个线程进入该方法,其他线程要想在此时调用该方法,只能排队等候,当前线程(就是在synchronized方法内部的线程)执行完该方法后,别的线程才能进入.
例如:
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_0.gif)
public
synchronized void synMethod() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_1.gif)
//方法体
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_2.gif)
}
2.对某一代码块使用
synchronized后跟括号,括号里是变量,这样,一次只有一个线程进入该代码块.此时,线程获得的是成员锁.例如:
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_3.gif)
public
int synMethod(int a1){
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_4.gif)
synchronized(a1)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_5.gif)
//一次只能有一个线程进入
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_6.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_7.gif)
}
3.对某一对象使用
synchronized后面括号里是一对象,此时,线程获得的是对象锁.例如:
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_8.gif)
public
class MyThread implements Runnable {
![](http://www.android100.org/uploadfile/2015/0214/20150214172416_9.gif)
public
static void main(String args[]) {
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_10.gif)
MyThread
mt = new MyThread();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_11.gif)
Thread
t1 = new Thread(mt, "t1");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_12.gif)
Thread
t2 = new Thread(mt, "t2");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_13.gif)
Thread
t3 = new Thread(mt, "t3");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_14.gif)
Thread
t4 = new Thread(mt, "t4");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_15.gif)
Thread
t5 = new Thread(mt, "t5");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_16.gif)
Thread
t6 = new Thread(mt, "t6");
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_17.gif)
t1.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_18.gif)
t2.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_19.gif)
t3.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_20.gif)
t4.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_21.gif)
t5.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_22.gif)
t6.start();
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_23.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_24.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_25.gif)
public
void run() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_26.gif)
synchronized
(this) {
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_27.gif)
System.out.println(Thread.currentThread().getName());
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_28.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_29.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_30.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_31.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172415_33.gif)
class
FineGrainLock {
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_34.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_35.gif)
MyMemberClass
x, y;
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_36.gif)
Object
xlock = new Object(), ylock = new Object();
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_37.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_38.gif)
public
void foo() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_39.gif)
synchronized(xlock)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_40.gif)
//access
x here
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_41.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_42.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_43.gif)
//do
something here - but don"t use shared resources
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_44.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_45.gif)
synchronized(ylock)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_46.gif)
//access
y here
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_47.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_48.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_49.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_50.gif)
public
void bar() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_51.gif)
synchronized(this)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_52.gif)
//access
both x and y here
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_53.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_54.gif)
//do
something here - but don"t use shared resources
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_55.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_56.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172414_57.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_58.gif)
4.对类使用时
synchronized后面括号里是类,此时,线程获得的是对象锁.例如:
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_59.gif)
class
ArrayWithLockOrder{
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_60.gif)
private
static long num_locks = 0;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_61.gif)
private
long lock_order;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_62.gif)
private
int[] arr;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_63.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_64.gif)
public
ArrayWithLockOrder(int[] a)
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_65.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_66.gif)
arr
= a;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_67.gif)
synchronized(ArrayWithLockOrder.class)
{//-----这里
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_68.gif)
num_locks++;
// 锁数加 1。
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_69.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_70.gif)
lock_order
= num_locks; // 为此对象实例设置唯一的 lock_order。
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_71.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_72.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_73.gif)
public
long lockOrder()
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_74.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_75.gif)
return
lock_order;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_76.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_77.gif)
public
int[] array()
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_78.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_79.gif)
return
arr;
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_80.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172413_81.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_82.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_83.gif)
class
SomeClass implements Runnable
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_84.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_85.gif)
public
int sumArrays(ArrayWithLockOrder a1,
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_86.gif)
ArrayWithLockOrder
a2)
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_87.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_88.gif)
int
value = 0;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_89.gif)
ArrayWithLockOrder
first = a1; // 保留数组引用的一个
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_90.gif)
ArrayWithLockOrder
last = a2; // 本地副本。
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_91.gif)
int
size = a1.array().length;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_92.gif)
if
(size == a2.array().length)
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_93.gif)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_94.gif)
if
(a1.lockOrder() > a2.lockOrder()) // 确定并设置对象的锁定
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_95.gif)
{
// 顺序。
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_96.gif)
first
= a2;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_97.gif)
last
= a1;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_98.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_99.gif)
synchronized(first)
{ // 按正确的顺序锁定对象。
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_100.gif)
synchronized(last)
{
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_101.gif)
int[]
arr1 = a1.array();
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_102.gif)
int[]
arr2 = a2.array();
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_103.gif)
for
(int i=0; i
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_104.gif)
value += arr1[i] + arr2[i];
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_105.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_106.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_107.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_108.gif)
return value;
![](http://www.android100.org/uploadfile/2015/0214/20150214172412_109.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_110.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_111.gif)
public void run() {
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_112.gif)
//
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_113.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_114.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_115.gif)
}
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_116.gif)
![](http://www.android100.org/uploadfile/2015/0214/20150214172411_117.gif)
对于4,如果线程进入,则线程在该类中所有操作不能进行,包括静态变量和静态方法,实际上,对于含有静态方法和静态变量的代码块的同步,我们通常用4来加锁.
以上为synchronized的四种用法。
相关文章推荐
- 图文详解Android属性动画
- 两个android程序间的相互调用传递参数
- Android平台Camera实时滤镜实现方法探讨(八)--滤镜基本制作方法(二)简单美颜滤镜
- Android Studio(IntelliJ IDEA)使用笔记
- Android内存优化杂谈
- Android studio svn 使用报错,解决办法
- Android自定义控件
- android&java 正则表达式
- android.graphics.Matrix详解
- 关于Android 传感器坐标与读数的进一步讨论
- Android实战 - 音心播放器 (通知实现音乐的播放/暂停/下一曲控制)
- Android 模拟器设置
- Android 广播接收器 BroadcastReceiver 注册、注销、优先级、拦截
- Android Studio如何设置代码自动提示
- android 模拟器报 no CPU/ABI system image for target
- 机器人操作系统,除了 Android 还有一个 ROS
- 机器人操作系统,除了 Android 还有一个 ROS
- android滑动删除的多种实现方式(一)
- 浅谈Android中的线程的通信及Handle机制
- Android 事件分发介绍