public
int synMethod(int a1){ synchronized(a1)
{ //一次只能有一个线程进入 } }
3.对某一对象使用
synchronized后面括号里是一对象,此时,线程获得的是对象锁.例如:
public
class MyThread implements Runnable { public
static void 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(); } public
void run() { synchronized
(this) { System.out.println(Thread.currentThread().getName()); } } }
class
FineGrainLock { MyMemberClass
x, y; Object
xlock = new Object(), ylock = new Object(); public
void foo() { synchronized(xlock)
{ //access
x here } //do
something here - but don"t use shared resources synchronized(ylock)
{ //access
y here } } public
void bar() { synchronized(this)
{ //access
both x and y here } //do
something here - but don"t use shared resources } }
4.对类使用时
synchronized后面括号里是类,此时,线程获得的是对象锁.例如:
class
ArrayWithLockOrder{ private
static long num_locks = 0; private
long lock_order; private
int[] arr; public
ArrayWithLockOrder(int[] a) { arr
= a; synchronized(ArrayWithLockOrder.class)
{//-----这里 num_locks++;
// 锁数加 1。 lock_order
= num_locks; // 为此对象实例设置唯一的 lock_order。 } } public
long lockOrder() { return
lock_order; } public
int[] array() { return
arr; } } class
SomeClass implements Runnable { public
int 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 value += arr1[i] + arr2[i]; } } } return value; } public void run() { // } }