标签:信息 赋值 注释 因此 rup 分析 xtend volatil 字节码
public class Synchronizedtest implements Runnable {
int i = 10; //共享变量
@Override
public void run() {
if( i == 10 ){
System.out.println("i == 10");
sys
i++;
}
}
public static void main(String[] args) throws InterruptedException {
Synchronizedtest st = new Synchronizedtest();
Thread t1 = new Thread(st,"线程1");
Thread t2 = new Thread(st,"线程2");
t1.start();
// t1.sleep(1000); 第一次测试先注释掉,第二次测试打开,下面为两次测试结果
t2.start();
}
}
i == 10
i == 10
i == 10
问题分析:
暂停
” 1秒,t2线程还不开启,t1在1秒内绝对执行完之后才开启t2线程,这样 i 的值已经更新为11了,此时t2就不输出内容
不设置共享变量,放入方法体内成为栈的独享空间
用final修饰基础变量,但引用变量用final修饰还是不行(指向不可变,但内容可变)
加锁(内置锁,显示Lock锁),后面会有说明
使用安全类
原子性:Atomic包
容器:ConcurrentHashMap
locks包
public class Synchronizedtest implements Runnable {
//使用的是该类的锁
@Override
public synchronized void run() {
for(int i = 0;i < 100;i++){
System.out.println(Thread.currentThread().getName() + "------" + i);
}
}
public static void main(String[] args) {
Synchronizedtest st = new Synchronizedtest();
Thread t1 = new Thread(st,"线程1");
Thread t2 = new Thread(st,"线程2");
t1.start();
t2.start();
}
}
线程1------96
线程1------97
线程1------98
线程1------99 //获得锁,执行完才释放,t2线程不能执行该方法
线程2------0
线程2------1
线程2------2
线程2------3
线程2------4
public void run() {
//使用的也是该类的锁,打印结果是一致的
//也可以用一个对象作为锁,客户端锁,但不推荐
synchronized(this){
for(int i = 0;i < 100;i++){
System.out.println(Thread.currentThread().getName() + "------" + i);
}
}
}
public class test {
//静态方法属于类,获取到的锁是属于类锁(类的字节码文件对象)
public static synchronized void test() {
}
}
二者不会冲突,即即可获得对象锁,也可获得类锁
public class testLock {
//对象锁
public synchronized void lockOne() throws InterruptedException {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
//类锁
public static synchronized void lockTwo() throws InterruptedException {
for (int i = 0; i < 100; i++) {
System.out.println(Thread.currentThread().getName() + ": " + i);
}
}
public static void main(String[] args) {
testLock demo = new testLock();
Thread t1 = new Thread(() -> {
try {
demo.lockOne();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
Thread t2 = new Thread(() -> {
try {
lockTwo();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
t1.start();
t2.start();
}
}
//两个线程都执行
Thread-1: 99
Thread-0: 35
public class Widget {
// 锁住了
public synchronized void doSomething() {
System.out.println("Wigget--------------");
}
}
public class LoggingWidget extends Widget {
// 锁住了
public synchronized void doSomething() {
System.out.println("LoggingWidget------------");
super.doSomething();
}
}
标签:信息 赋值 注释 因此 rup 分析 xtend volatil 字节码
原文地址:https://www.cnblogs.com/Howlet/p/12230652.html