1,并发场景不加锁,代码如下
package cn.womusic.bp.batch.test.synchorized;
public class SynchronizedDemo implements Runnable {
private static int count = 0;
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new SynchronizedDemo());
thread.start();
}
}
@Override
public void run() {
for (int i = 0; i < 10000; i++){
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
}
}
结果,可以看到线程0-4没有按照顺序输出 0-9999
Thread-0:3
Thread-4:5
Thread-4:7
Thread-4:8
Thread-4:9
Thread-4:10
Thread-3:4
Thread-2:3
result: 3
Thread-1:3
Thread-2:13
Thread-3:12
Thread-4:11
Thread-0:6
Thread-4:17
Thread-4:19
Thread-3:16
Thread-2:15
.......
2 ,采用同步方法
package cn.womusic.bp.batch.test.synchorized;
public class SynchronizedDemo implements Runnable {
private static int count = 0;
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new SynchronizedDemo());
thread.start();
}
}
@Override
public void run() {
syncMthdMethod();
}
/**
* 同步方法
* */
private synchronized void syncMthdMethod() {
for (int i = 0; i < 10000; i++){
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
}
}
}
结果
Thread-2:4
Thread-2:6
Thread-2:7
Thread-2:8
Thread-4:5
Thread-4:10
Thread-3:4
Thread-3:12
Thread-3:13
Thread-3:14
Thread-3:15
Thread-3:16
......
结论,没锁住,因为 每个线程 各自new了 一个SynchronizedDemo。
换个玩法
package cn.womusic.bp.batch.test.synchorized;
public class SynchronizedDemo implements Runnable {
private static int count = 0;
public static void main(String[] args) {
SynchronizedDemo demo = new SynchronizedDemo();
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(demo);
thread.start();
}
}
@Override
public void run() {
syncMthdMethod();
}
/**
* 同步方法
* */
private synchronized void syncMthdMethod() {
for (int i = 0; i < 10000; i++){
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
}
结果
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
Thread-0:10
Thread-0:11
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17
Thread-0:18
Thread-0:19
Thread-0:20
Thread-0:21
Thread-0:22
Thread-0:23
Thread-0:24
Thread-0:25
Thread-0:26
Thread-0:27
Thread-0:28
Thread-0:29
......
结论:同步方法的锁是对象本身,是对象本身,是对象本身!!!!
3 静态同步方法
package cn.womusic.bp.batch.test.synchorized;
public class SynchronizedDemo implements Runnable {
private static int count = 0;
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new SynchronizedDemo());
thread.start();
}
}
@Override
public void run() {
syncStaticMthdMethod();
}
/**
* 静态同步方法
* */
private static synchronized void syncStaticMthdMethod() {
for (int i = 0; i < 10000; i++){
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
}
}
}
结果
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
Thread-0:10
Thread-0:11
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17
Thread-0:18
Thread-0:19
Thread-0:20
Thread-0:21
Thread-0:22
Thread-0:23
Thread-0:24
Thread-0:25
Thread-0:26
Thread-0:27
Thread-0:28
Thread-0:29
结论 静态同步方法的锁对象是 类本身
4、同步代码块。this
package cn.womusic.bp.batch.test.synchorized;
public class SynchronizedDemo implements Runnable {
private static int count = 0;
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new SynchronizedDemo());
thread.start();
}
}
@Override
public void run() {
synchronized(this){
for (int i = 0; i < 10000; i++){
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
}
}
}
结果没锁柱
Thread-2:3
Thread-0:3
Thread-1:3
Thread-3:4
Thread-1:8
Thread-0:7
Thread-0:11
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17
Thread-0:18
Thread-0:19
Thread-4:6
改一下
public static void main(String[] args) {
SynchronizedDemo demo = new SynchronizedDemo();
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(demo );
thread.start();
}
}
结果
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
Thread-0:10
Thread-0:11
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17
Thread-0:18
Thread-0:19
Thread-0:20
Thread-0:21
结论 同步代码块的锁对象 this时是 对象本身
4、同步代码块。xxx.class
package cn.womusic.bp.batch.test.synchorized;
public class SynchronizedDemo implements Runnable {
private static int count = 0;
public static void main(String[] args) {
for (int i = 0; i < 5; i++) {
Thread thread = new Thread(new SynchronizedDemo() );
thread.start();
}
}
@Override
public void run() {
synchronized(SynchronizedDemo.class){
for (int i = 0; i < 10000; i++){
count++;
System.out.println(Thread.currentThread().getName() + ":" + count);
}
}
}
结果
Thread-0:1
Thread-0:2
Thread-0:3
Thread-0:4
Thread-0:5
Thread-0:6
Thread-0:7
Thread-0:8
Thread-0:9
Thread-0:10
Thread-0:11
Thread-0:12
Thread-0:13
Thread-0:14
Thread-0:15
Thread-0:16
Thread-0:17