1.Synchronized?
synchronized是Java中解决并发问题的一种最常见也是最简单的方法。synchrinzed的作用主要作用有三个:? ??
(1)确保线程互斥的访问同步代码
(2)保证共享变量的修改能够及时看到
(3)有效解决重排序问题
synchronized总共有三个作用:
(1)修饰普通方法
(2)修饰静态方法
(3)修饰代码块
1.没有同步块的情况
public class SynchronizedTest {
public static void main(String[] args) {
final SynchronizedTest test =new SynchronizedTest();
? ? ? ? new Thread(new Runnable() {
@Override
? ? ? ? ? ? public void run() {
test.methodOne();
? ? ? ? ? ? }
}).start();
? ? ? ? new Thread(new Runnable() {
@Override
? ? ? ? ? ? public void run() {
test.methodTwo();
? ? ? ? ? ? }
}).start();
? ? }
public void methodOne() {
System.out.println("Method One start");
? ? ? ? try {
System.out.println("Method One execute");
? ? ? ? ? ? Thread.sleep(3000);
? ? ? ? }catch (Exception e) {
e.printStackTrace();
? ? ? ? }
System.out.println("Method One end");
? ? }
public void methodTwo() {
System.out.println("Method Two start");
? ? ? ? try {
System.out.println("Method Two execute");
? ? ? ? ? ? Thread.sleep(1000);
? ? ? ? }catch (Exception e) {
e.printStackTrace();
? ? ? ? }
System.out.println("Method Two end");
? ? }
}
执行结果:
Method One start
Method One execute
Method Two start
Method Two execute
Method Two end
Method One end
Process finished with exit code 0
2.对普通方法使用synchronized修饰同步
public class SynchronizedTest {
public static void main(String[] args) {
final SynchronizedTest test =new SynchronizedTest();
? ? ? ? new Thread(new Runnable() {
@Override
? ? ? ? ? ? public void run() {
test.methodOne();
? ? ? ? ? ? }
}).start();
? ? ? ? new Thread(new Runnable() {
@Override
? ? ? ? ? ? public void run() {
test.methodTwo();
? ? ? ? ? ? }
}).start();
? ? }
public synchronized void methodOne() {
System.out.println("Method One start");
? ? ? ? try {
System.out.println("Method One execute");
? ? ? ? ? ? Thread.sleep(3000);
? ? ? ? }catch (Exception e) {
e.printStackTrace();
? ? ? ? }
System.out.println("Method One end");
? ? }
public synchronized void methodTwo() {
System.out.println("Method Two start");
? ? ? ? try {
System.out.println("Method Two execute");
? ? ? ? ? ? Thread.sleep(1000);
? ? ? ? }catch (Exception e) {
e.printStackTrace();
? ? ? ? }
System.out.println("Method Two end");
? ? }
}
执行结果:
Method One start
Method One execute
Method One end
Method Two start
Method Two execute
Method Two end
Process finished with exit code 0
3.使用synchronized修饰静态方法