synchronized用于同步操作;
原理:
通过锁旗标(一个标记)锁住当前操作让其他相同操作的处于队列等待状态 处理完成释放锁
作用:
示例代码 消费 :
public class Synch {
@Test
public void test(){
TestThread testThread1 = new TestThread();
new Thread(testThread1).start();;
new Thread(testThread1).start();
while (true);
}
}
class TestThread implements Runnable{
private static int money =17;
@Override
public void run() {
while (true){
// synchronized (this){
if(money>0){
try {
Thread.sleep(10);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
}
//}
}
// while (true){
// buy2();
// }
}
public synchronized void buy(){
if(money>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
}
}
public synchronized static void buy2(){
if(money>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
}
}
}
1. 作用于代码块
没有同步关键字:
// synchronized (this){
if(money>0){
try {
Thread.sleep(10);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
}
//}
会出现负数的情景 因为 t1 t2 都会得到money>0等 t1 处理完成 t2已进入处理流程
加入同步关键字:
synchronized (this){
if(money>0){
try {
Thread.sleep(10);
}catch (InterruptedException e){
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
}
}
2. 作用于成员方法
public synchronized void buy(){
if(money>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
}
}
3.作用于静态方法
public synchronized static void buy2(){
if(money>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
}
}
作用于成员方法与作用于静态方法的区别:
@Test
public void test(){
TestThread testThread1 = new TestThread();
TestThread testThread2 = new TestThread();
new Thread(testThread1).start();;
new Thread(testThread2).start();
while (true);
}
class TestThread implements Runnable{
private static int money =17;
@Override
public void run() {
// while (true){
// synchronized (this){
// if(money>0){
// try {
// Thread.sleep(10);
// }catch (InterruptedException e){
// e.printStackTrace();
// }
// System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
// }
// }
//
// }
//静态
while (true){
buy2();
}
//实例成员
while (true){
buy();
}
}
public synchronized void buy(){
if(money>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
}
}
public synchronized static void buy2(){
if(money>0){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"money剩余:"+--money);
}
}
}
成员方法修饰的是 本身对象
可以发现这时就不同步了
静态方法修饰的书Class对象